把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend

Posted blues

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend相关的知识,希望对你有一定的参考价值。

 1 //把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend
 2 //dp[i][j]:把第i个数转成第j小的数,最小花费
 3 //此题与poj 3666相似 a[i]转换成a[i]-i
 4 
 5 #include <iostream>
 6 #include <cstdio>
 7 #include <cstdlib>
 8 #include <algorithm>
 9 #include <vector>
10 #include <math.h>
11 #include <memory.h>
12 using namespace std;
13 #define LL long long
14 typedef pair<int,int> pii;
15 const int inf = 0x3f3f3f3f;
16 const LL MOD =100000000LL;
17 const int N = 3000+10;
18 const double eps = 1e-8;
19 void fre() {freopen("in.txt","r",stdin);}
20 void freout() {freopen("out.txt","w",stdout);}
21 inline int read() {int x=0,f=1;char ch=getchar();while(ch>9||ch<0) {if(ch==-) f=-1; ch=getchar();}while(ch>=0&&ch<=9) {x=x*10+ch-0;ch=getchar();}return x*f;}
22 
23 int a[N],b[N];
24 LL dp[N][N];
25 int main(){
26     int n;
27     scanf("%d",&n);
28     for(int i=1;i<=n;i++){
29         scanf("%d",&a[i]);
30         a[i]-=i;
31         b[i]=a[i];
32     }
33     sort(b+1,b+1+n);
34     for(int i=1;i<=n;i++){
35         dp[1][i]=abs(a[1]-b[i]);
36     }
37     for(int i=2;i<=n;i++){
38         LL minn=1e18;
39         for(int j=1;j<=n;j++){
40            minn=min(minn,dp[i-1][j]);
41            dp[i][j]=minn+abs(a[i]-b[j]);
42         }
43     }
44     LL ans=1e18;
45     for(int i=1;i<=n;i++){
46         ans=min(ans,dp[n][i]);
47     }
48     cout<<ans<<endl;
49     return 0;
50 }

 

以上是关于把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend的主要内容,如果未能解决你的问题,请参考以下文章

dp专题 cf 4D

[CF960F]Pathwalks

CF C. Three displays(DP+思维)

使序列递增的最小交换

将一个序列调整为单调序列的最小代价问题

CF264B Good Sequences