如果做过cf 13C sequence应该马上就能发现这两道题惊人的相似
但是这题要求严格递增,怎么办呢?
于是有一个神奇的做法
对于a[i],将其减去i,得到新数组b,b数组中只要保证不下降,a就能保证严格递增
于是可以上dp代码了
(dp方程可以看13C sequence)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59#include <cstdio> #include <iostream> #include <cstring> #include <string> #include <cmath> #include <algorithm> #include <cstdlib> #include <utility> #include <map> #include <stack> #include <set> #include <vector> #include <queue> #include <deque> #define x first #define y second #define mp make_pair #define pb push_back #define LL long long #define Pair pair<int,int> #define LOWBIT(x) x & (-x) using namespace std; const int INF=0x7ffffff; int n; int a[3048]; vector<int> v; LL dp[3048][3048]; inline int myabs(int x) { return x>=0?x:-x; } int main () { int i,j; scanf("%d",&n); for (i=1;i<=n;i++) { scanf("%d",&a[i]); a[i]-=i; v.pb(a[i]); } sort(v.begin(),v.end()); v.resize(unique(v.begin(),v.end())-v.begin()); for (j=0;j<v.size();j++) if (j==0) dp[1][j]=myabs(a[1]-v[j]); else dp[1][j]=min(dp[1][j-1],(LL)myabs(a[1]-v[j])); for (i=2;i<=n;i++) for (j=0;j<v.size();j++) if (j==0) dp[i][j]=dp[i-1][j]+myabs(a[i]-v[j]); else dp[i][j]=min(dp[i][j-1],dp[i-1][j]+myabs(a[i]-v[j])); //int ans=INF; //for (j=0;j<v.size();j++) ans=min(ans,dp[n][j]); cout<<dp[n][v.size()-1]<<endl; return 0; }
最后
以上就是忐忑皮卡丘最近收集整理的关于Codeforces #713C: Sonya and Problem without a Legend 题解的全部内容,更多相关Codeforces内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复