poj 3666 Making the Grade (线性结构上的DP )
2015-04-10 21:30
176 查看
题意:
给定n个数,问你将他们修改成非增或非减序列的最小花费。最小花费的定义是
假设原数组为 a[1] a[2] a[3] .... a
修改后数组为 b[1] b[2] b[3] .... b
那么最小花费为|a[1]-b[1]|+|a[2]-b[2]|+| a[3] - b[3] |+.....| a
- b
|.
思路:
线性结构上的动态规划 定义状态d[i][j] 表示 前i-1个数字已经是最小花费 现在把第i个数修改成b[j] 修改完成后前i个数总共最少需要的花费是多少
状态转移 见代码
或者看这个链接:http://www.hankcs.com/program/cpp/poj-3666-making-the-grade.html
值得注意的是 不知道是我理解错题意还是有些人做错了 弱感觉他们只考虑了非减的情况 但是却AC了。他们的代码是不能解决 3 2 1 这个样例的...弱以为应该输出0才对啊;
code:
给定n个数,问你将他们修改成非增或非减序列的最小花费。最小花费的定义是
假设原数组为 a[1] a[2] a[3] .... a
修改后数组为 b[1] b[2] b[3] .... b
那么最小花费为|a[1]-b[1]|+|a[2]-b[2]|+| a[3] - b[3] |+.....| a
- b
|.
思路:
线性结构上的动态规划 定义状态d[i][j] 表示 前i-1个数字已经是最小花费 现在把第i个数修改成b[j] 修改完成后前i个数总共最少需要的花费是多少
状态转移 见代码
或者看这个链接:http://www.hankcs.com/program/cpp/poj-3666-making-the-grade.html
值得注意的是 不知道是我理解错题意还是有些人做错了 弱感觉他们只考虑了非减的情况 但是却AC了。他们的代码是不能解决 3 2 1 这个样例的...弱以为应该输出0才对啊;
code:
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn = 2005; int n; int a[maxn], b[maxn]; int dp[maxn][maxn]; bool cmp1(int a1, int a2){ return a1 > a2; } void init(){ int tmp; for(int i = 1; i <= n; i++){ scanf("%d",&tmp); a[i] = b[i] = tmp; } sort(b+1, b+n+1); } void solve(){ memset(dp,0,sizeof(dp)); for(int i = 1; i <= n; i++){ dp[1][i] = abs(a[1] - b[i]); } for(int i = 2; i <= n; i++){ int min_cost = dp[i-1][1]; for(int j = 1; j <= n; j++){ min_cost = min(min_cost, dp[i-1][j]); dp[i][j] = min_cost + abs(a[i] - b[j]); } } int ans1 = dp [1]; for(int i = 2; i <= n; i++){ ans1 = min(ans1, dp [i]); } sort(b+1, b+n+1, cmp1); memset(dp,0,sizeof(dp)); for(int i = 1; i <= n; i++){ dp[1][i] = abs(a[1] - b[i]); } for(int i = 2; i <= n; i++){ int min_cost = dp[i-1][1]; for(int j = 1; j <= n; j++){ min_cost = min(min_cost, dp[i-1][j]); dp[i][j] = min_cost + abs(a[i] - b[j]); } } int ans2 = dp [1]; for(int i = 2; i <= n; i++){ ans2 = min(ans2, dp [i]); } printf("%d\n",min(ans1, ans2)); } int main(){ while(scanf("%d",&n) != EOF){ init(); solve(); } return 0; } /* 3 3 2 1 */
相关文章推荐
- POJ 1948 Triangular Pastures(双线性dp)
- POJ 1157 LITTLE SHOP OF FLOWERS (线性dp)
- Poj 3017 Cut the Sequence (DP,单调队列优化,数据结构优化)
- poj 1141 Brackets Sequence(线性dp)
- poj 1088 滑雪(线性DP)
- POJ - 2479 《Maximum sum》 【线性DP】
- POJ 1745 Divisibility (线性dp)
- POJ 3783 Balls (线性dp 智力题)
- POJ 3624 Charm Bracelet (线性dp 0/1背包)
- 动态规划_线性结构上的DP
- POJ 1163 The Triangle (简单线性dp)
- POJ 3378——Crazy Thairs(树状数组+dp+高精度)数据结构优化的DP
- (常复习)poj 1015 dp+记录dp路径+转变最优子结构+区间映射
- POJ 1745 Divisibility (线性dp)
- POJ 3661 (线性DP)
- POJ 1050 To the Max (简单的线性dp)
- POJ 1925 Spiderman(线性dp)
- POJ 2479-Maximum sum(线性dp)
- POJ 2250 Compromise (线性dp LCS +递归路径)
- POJ 3321 Apple Tree 【树形结构转变为线性结构+线段树OR树状数组】