Uva 1629 切蛋糕
2017-01-01 11:05
381 查看
题目链接:https://vjudge.net/contest/146179#problem/B
题意:一个矩形蛋糕上有好多个樱桃,现在要做的就是切割最少的距离,切出矩形形状的小蛋糕,让每个蛋糕上都有一个樱桃~问最少切割距离是?
分析:可以根据每次的切割范围遍历找最优值,也就是说状态描述d[u][d][l][r] 是这个范围内的最短距离。要是这个范围内只有一个樱桃,那么就是 0 ,要是没有樱桃就是无穷大。
题意:一个矩形蛋糕上有好多个樱桃,现在要做的就是切割最少的距离,切出矩形形状的小蛋糕,让每个蛋糕上都有一个樱桃~问最少切割距离是?
分析:可以根据每次的切割范围遍历找最优值,也就是说状态描述d[u][d][l][r] 是这个范围内的最短距离。要是这个范围内只有一个樱桃,那么就是 0 ,要是没有樱桃就是无穷大。
#include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; bool maps[25][25]; int r,c,cnt; int dps[25][25][25][25]; int sum(int u,int d,int l,int r) { int sums = 0; for(int i=u; i<=d; i++) for(int j=l; j<=r; j++) if(maps[i][j]) sums++; return sums; } int dp(int u,int d,int l,int r) { int &ans = dps[u][d][l][r]; if(ans!=-1) return ans; else if(sum(u,d,l,r)==1) return ans=0; else if(sum(u,d,l,r)==0) return ans=INF; else { ans = INF; for(int i=u; i<=d; i++) ans = min(ans,dp(u,i,l,r)+dp(i+1,d,l,r)+r-l+1); for(int i=l; i<=r; i++) ans = min(ans,dp(u,d,l,i)+dp(u,d,i+1,r)+d-u+1); } return ans; } int main() { int kase = 1; while(scanf("%d%d%d",&r,&c,&cnt)!=EOF) { memset(dps,-1,sizeof(dps)); memset(maps,0,sizeof(maps)); for(int i=0; i<cnt; i++) { int rx,ry; scanf("%d%d",&rx,&ry); maps[rx][ry] = 1; } printf("Case %d: %d\n",kase++,dp(1,r,1,c)); } return 0; }
相关文章推荐
- 深入理解Java:注解(Annotation)自定义注解入门
- android 多个imageview缩放,拖动
- 数据挖掘中的支持度 置信度 期望置信度 提升度
- activity中的fragment里面的detroy()方法中清理SharedPreferences文件的问题
- 定义了Shape,但是在LinearLayout中却显示不出来为什么啊?
- 洛谷2105 k皇后
- MySQL 从 5.5 升级到 5.6,启动时报错 [ERROR] Plugin 'InnoDB' init function returned error
- 和2016年的自己握手言和
- TProfiler
- 两个浮点数比较明明相等为啥还是会进if条件啊
- 一个调用多层次json的简便工具类
- (十四)文件操作——stat命令与函数
- idea本地调试hadoop
- Project Euler Question 4
- 网络:TCP/IP协议与socket的关系(转载)
- LeetCode448. Find All Numbers Disappeared in an Array新年第一篇
- 优雅编程之阿里巴巴开发规范分享及扩展学习(三十八)
- Linux上获取命令帮助的几种方式
- 发现bug出在哪里,然后解决---程序员的日常--- 页面调试
- web前端程序员真的值这么多钱吗?