Codeforces 713C Sonya and Problem Wihtout a Legend DP
题意:求一个序列变为严格递增序列的最小花费。
思路:这题和POJ3666本质相似,POJ3666求的是非严格递增,在这题的条件下,我们只要将a[i]-i预处理,再按照相同的做法就可以保证严格递增了。QD某校赛比赛时候看到这题就觉得好像,结果一直没有想出来怎么改,POJ那题还是最近做过的呐。/.\另外这题还可以用优先队列做...
/** @Date : 2016-11-26-17.16 * @Author : Lweleth (SoungEarlf@gmail.com) * @Link : https://github.com/ * @Version : */ #include<bits/stdc++.h> #define LL long long #define MMF(x) memset((x),0,sizeof(x)) #define MMI(x) memset((x), INF, sizeof(x)) using namespace std; const int INF = 0x3f3f3f3f; const int N = 1e5+2000; int a[3030]; int b[3030]; LL dp[3030][3030]; int main() { int n; while(~scanf("%d", &n)) { MMF(dp); for(int i = 1; i <= n; i++) { scanf("%d", a + i); a[i] -= i; b[i] = a[i]; } sort(b + 1, b + 1 + n); for(int i = 1; i <= n; i++) { dp[i][1] = dp[i - 1][1] + abs(a[i] - b[1]); for(int j = 2; j <= n; j++) { dp[i][j] = min(dp[i - 1][j] + abs(a[i] - b[j]), dp[i][j - 1]); } } printf("%lld\n", dp[n][n]); } return 0; }