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 }

 

posted @ 2021-02-07 16:05  acmloser  阅读(70)  评论(0编辑  收藏  举报