wenbao与cf最大上升序列3(改变给定序列的值变为严格递增序列)
1 如果 a[i] < a[i+1]; 那么a[i] <= a[i+1] +1; 2 也可以写为 a[i] - i <= a[i+1] - (i + 1); 3 令 b[i] = a[i] - i; 则 b[i] <= b[i+1];
http://codeforces.com/contest/714/problem/E
通过加减变为严格单调递增序列,求最小值
大神代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long f[12345],a[12345],b[12345],n; 4 int main() 5 { 6 cin>>n; 7 for(int i=0;i<n;i++) 8 { 9 cin>>a[i]; 10 a[i]-=i; 11 b[i]=a[i]; 12 } 13 14 sort(b,b+n); 15 16 for(int i=0;i<n;i++) 17 { 18 for(int j=0;j<n;j++) 19 { 20 f[j]+=abs(a[i]-b[j]); 21 f[j]=(j && f[j-1]<f[j]) ?f[j-1]:f[j]; 22 } 23 } 24 cout<<f[n-1]<<endl; 25 }
只有不断学习才能进步!