我是靠谱客的博主 忐忑皮卡丘,最近开发中收集的这篇文章主要介绍Codeforces #713C: Sonya and Problem without a Legend 题解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

如果做过cf 13C sequence应该马上就能发现这两道题惊人的相似

但是这题要求严格递增,怎么办呢?

于是有一个神奇的做法

对于a[i],将其减去i,得到新数组b,b数组中只要保证不下降,a就能保证严格递增

于是可以上dp代码了

(dp方程可以看13C sequence)

#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 #713C: Sonya and Problem without a Legend 题解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部