UVa1629 Cake Slicing
来源:互联网 发布:java如何让窗口置顶 编辑:程序博客网 时间:2024/05/20 04:28
题目描述
设
则在它内部切一刀可转移到其他两块矩形(切后两块矩形内至少要有一个樱桃)
边界是当矩形内部只有一个樱桃时
先预处理出每一块矩形内部有几个樱桃。
代码
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;int n,m,k,d[22][22][22][22],f[22][22][22][22];int dp(int r,int c,int i,int j){ if(f[r][c][i][j]==1) return 0; int& ans=d[r][c][i][j]; if(ans>-1) return ans; ans=1e9; for(int j1=1;j1<j;j1++) if(f[r][c][i][j1]&&f[r][c+j1][i][j-j1]) ans=min(ans,dp(r,c,i,j1)+dp(r,c+j1,i,j-j1)+i); for(int i1=1;i1<i;i1++) if(f[r][c][i1][j]&&f[r+i1][c][i-i1][j]) ans=min(ans,dp(r,c,i1,j)+dp(r+i1,c,i-i1,j)+j); return ans;}int main(){ int kase=0; while(scanf("%d%d%d",&n,&m,&k)==3&&n&&m){ memset(f,0,sizeof(f)); memset(d,-1,sizeof(d)); for(int i=0;i<k;i++){ int a,b; scanf("%d%d",&a,&b); f[a-1][b-1][1][1]=1; } for(int r=0;r<n;r++) for(int c=0;c<m;c++) for(int i=1;i+r<=n;i++) for(int j=1;j+c<=m;j++) f[r][c][i][j]=f[r][c][i-1][j]+f[r][c][i][j-1]-f[r][c][i-1][j-1]+f[r+i-1][c+j-1][1][1]; //可以利用前缀和思想只用2重循环 printf("Case %d: %d\n",++kase,dp(0,0,n,m)); } return 0;}
时间复杂度
阅读全文
0 0
- UVA1629---Cake slicing
- Uva1629:Cake slicing
- UVa1629 Cake Slicing
- 【UVA1629】Cake slicing
- UVA1629[Cake slicing] 棋盘动态规划
- 【DP 训练】Cake Slicing, ACM/ICPC Nanjing 2007, UVa1629
- UVa 1629 - Cake slicing
- 1629 - Cake slicing
- UVA 1629 Cake slicing
- Cake slicing UVA
- Cake slicing UVA
- 1629 - Cake slicing(DP)
- UVA 1629 - Cake slicing 题解
- UVa 1629 Cake Slicing DP
- uva - 1629 Cake slicing(dp)
- uva 1629 cake slicing(dp)
- Uva-1629 Cake slicing(DP)
- UVa #1629 Cake slicing (习题9-3)
- 233 Matrix HDU
- 欢迎使用CSDN-markdown编辑器
- Android Studio起步配置
- [OpenGL] Normal Mapping 法线映射
- 多线程的四种状态及同步机制的应用(火车票线程同步)
- UVa1629 Cake Slicing
- poj 2985 The k-th Largest Group (Treap+并查集)
- python3与2的区别
- Hbase shell 命令
- Spring事务管理
- linux系统服务状态
- 三(6)、JSP九大内置对象——application
- xml之JDOM解析(含乱码处理)
- ubuntu修改为阿里源