初入算法篇(动态规划)书架问题2
2018-04-02 23:34
771 查看
题意:将n本书按高度由小到大排序,然后求出书架的不整齐度。不整齐度=每两本书宽度的差的绝对值的和
如有4本书 1*2 5*3 2*4 3*1
排序后 1*2 2*4 3*1 5*3
不整齐度就是2+3+2=7,求出去掉k本书后最小不整齐度
题解:逆向思维,求出n-k本书的最小不整齐度即可
转移方程为 f[i][j]=min{f[x][j-1]+abs(w[x]-w[i]),f[i][j]}
注意i,j,x的范围i==[1,n] j==[2,min{i,n-k}] x==[j-1,i-1]
题目要求了不高度都不相同,但参考代码明显有bug,测试数据也是,加深理解即可,不需要纠结
我个人认为直接sort函数由小到大直接解决....
4 1
2 2
2 4
3 2
5 3 输出 1
如有4本书 1*2 5*3 2*4 3*1
排序后 1*2 2*4 3*1 5*3
不整齐度就是2+3+2=7,求出去掉k本书后最小不整齐度
题解:逆向思维,求出n-k本书的最小不整齐度即可
转移方程为 f[i][j]=min{f[x][j-1]+abs(w[x]-w[i]),f[i][j]}
注意i,j,x的范围i==[1,n] j==[2,min{i,n-k}] x==[j-1,i-1]
题目要求了不高度都不相同,但参考代码明显有bug,测试数据也是,加深理解即可,不需要纠结
我个人认为直接sort函数由小到大直接解决....
4 1
2 2
2 4
3 2
5 3 输出 1
15 3 2 2 2 4 3 2 1 3 1 2 3 6 4 8 5 6 6 7 2 3 3 3 1 2 2 2 3 4 5 4 输出 24
#include <iostream> #include <cstdio> #include <string.h> #include <algorithm> #include <cmath> #define INF 999999 using namespace std; struct node { int w; int h; } a[1009]; int cmp(const void *a,const void *b) { node *t1=(node *)a; node *t2=(node *)b; if (t1->h>t2->h) return 1; if (t1->h<t2->h) return -1; return 0; } int cmp1(node a,node b) { return a.h<b.h; } int f[1009][1009]; int main() { int n,k,i,j,x; while(1) { scanf("%d%d",&n,&k); for(i=1; i<=n; i++) { scanf("%d%d",&a[i].h,&a[i].w); } a[0].h=-1; qsort(a,n+1,sizeof(a[0]),cmp); /*sort(a+1,a+1+n,cmp1); printf("\n\n"); for(i=1;i<=n;i++) { printf("%d %d\n",a[i].h,a[i].w); } a[0].h=-1; qsort(a,n+1,sizeof(a[0]),cmp); printf("\n\n"); for(i=1;i<=n;i++) { printf("%d %d\n",a[i].h,a[i].w); }*/ for(i=1; i<=n; i++) { for(j=2; j<=min(i,n-k); j++) { f[i][j]=INF; for(x=j-1; x<=i-1; x++) { f[i][j]=min(f[i][j],f[x][j-1]+abs(a[x].w-a[i].w)); } } } int ans=f[n-k][n-k];//从n-k本书取n-k本书 for(i=n-k; i<=n; i++) { ans=min(ans,f[i][n-k]); } printf("%d\n",ans); } }
相关文章推荐
- 【算法学习】切割木棍问题——动态规划
- 算法_动态规划_石子合并问题
- 算法学习 - 01背包问题(动态规划C++)
- 算法分析与设计实验二(关于动态规划问题)
- 算法_动态规划_独立任务最优调度问题
- 算法导论三剑客之 动态规划 01背包问题
- 机试算法讲解: 第49题 动态规划之最长递增子序列问题
- 算法之道_流水线装配问题_动态规划
- 算法分析与设计实验二(关于动态规划问题)
- 算法练习笔记(十一)— 动态规划之分解问题
- 【算法设计与分析】7、0/1背包问题,动态规划
- 算法_动态规划_序关系计数问题
- 算法_动态规划_编辑距离问题
- 算法3:动态规划(二)——背包问题
- 1.4买书问题之贪心算法和动态规划
- 算法回顾 - 动态规划 之 最长公共子串问题
- 算法学习笔记----用动态规划解决钢管切割问题
- 常见算法及问题场景——动态规划
- [算法导论]动态规划---最长公共最序列问题
- JAVA代码—算法基础:最少货币换钱问题求解(动态规划)