poj3666-基础DP
2017-07-21 16:12
155 查看
题意:然你求如何使得这个序列单调不减或者单调不增然后代价比较小,因为数据比较弱只要求单调不增就可以了
题解:dp[i][j]表示第i个位置改成第j小的数字代价花的最少然后记录一下i-1个位置改成第1-第j小的代价是多少就可以
dp[i][j] = pre[i-1][j]+abs(b[j]-a[i]);
pre[i][j] = min(dp[i][j],pre[i][j-1]);
题解:dp[i][j]表示第i个位置改成第j小的数字代价花的最少然后记录一下i-1个位置改成第1-第j小的代价是多少就可以
dp[i][j] = pre[i-1][j]+abs(b[j]-a[i]);
pre[i][j] = min(dp[i][j],pre[i][j-1]);
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int inf = 0x3f3f3f3f; const int mx = 2005; int dp[mx][mx]; int pre[mx][mx]; int a[mx]; int b[mx]; int main(){ int n; while(scanf("%d",&n)!=EOF){ memset(dp,inf,sizeof(dp)); memset(pre,inf,sizeof(pre)); for(int i = 1; i <= n; i++){ scanf("%d",&a[i]); b[i] = a[i]; pre[0][i] = 0; } sort(b+1,b+1+n); for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++){ dp[i][j] = pre[i-1][j]+abs(b[j]-a[i]); pre[i][j] = min(dp[i][j],pre[i][j-1]); } int ans = inf; for(int i = 1; i <= n; i++) ans = min(ans,dp [i]); printf("%d\n",ans); } return 0; }
相关文章推荐
- 基础树形DP小结
- 个人DP训练(基础版)
- 每日三题-Day4-B(POJ 1661 Help Jimmy 基础DP)
- android基础----px 与 dp, sp换算公式
- hdu1078基础dp
- 【基础dp】HDU 1260 Tickets
- HDU Problem E [ 最长下降子序列 堆箱子]——基础dp模板题变式
- HDU 2059 龟兔赛跑 基础DP 好题
- 基础DP
- LeetCode 198 House Robber(基础DP)
- HDU Problem G [ 数塔问题变式 天上掉馅饼 ]——基础dp
- CodeForces 268D Wall Bars [基础DP]
- HDU 1159 【基础DP 最长公共子序列】
- DP背包基础
- 【基础练习】【线性DP+离散化】codevs1105 过河题解
- uva1292(基础树形dp)
- 最长公共字符串 基础DP
- 基础树形DP小结
- FatMouse's Speed 基础DP
- Super Jumping! Jumping! Jumping! 基础DP