Sonya and Problem Wihtout a Legend CodeForces - 713C
考察:线性DP
和上道题其实是一样的题,区别在于这里要求是严格上升序列
但是转化一下就可以变成非严格上升序列:
非严格上升序列 b[i]-b[i-1]>=0
严格上升序列 b[i]-b[i-1]>=i-(i-1)//1是这么来的
因此变一下 b[i]-i>=b[i-1]-i+1即可
构造a[i] = a[i]-i,剩下的一样求,主数列减了i,构造的b数列也减去了i,所以答案可以直接输出.
关于进阶指南上为什么序列总长-a的LIS长度不对:
因为LIS的元素间隔长度可能不够递增,而非严格是一定够递增的
坑点:
注意long long
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 typedef long long ll; 7 const int N = 3010; 8 const long long INF = 9223372036854775807ll; 9 int a[N],c[N]; 10 ll f[N][N],ans = INF; 11 int main() 12 { 13 int n; 14 scanf("%d",&n); 15 for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i]-=i,c[i] = a[i]; 16 sort(c+1,c+n+1); 17 for(int i=1;i<=n;i++) 18 { 19 ll minv = INF; 20 for(int j=1;j<=n;j++) 21 { 22 minv = min(minv,f[i-1][j]); 23 f[i][j] = minv+(ll)abs(a[i]-c[j]); 24 } 25 } 26 for(int i=1;i<=n;i++) ans = min(ans,f[n][i]); 27 printf("%lld\n",ans); 28 return 0; 29 }