Codeforces 598E Chocolate Bar 【区间dp + 打表】
来源:互联网 发布:诛仙手游数据互通吗 编辑:程序博客网 时间:2024/06/07 17:25
自己花了1个半小时AC了,还是很有收获的。
题意:给定n*m块连在一起的巧克力,现在要取出k块,已知每次可以水平或竖直的分割(切到底),代价是分割线的平方。问取出k块巧克力需要的最少代价。
思路:设置dp[k][n][m]为在n*m块连在一起的巧克力上取出k块需要的最少代价。
状态转移方程 (其中0 <= i <= k 因为在分开的两大块中可以任意选取要取多少块来使得取的总块数 = k)
在row位置横切:1 <= row < n 可以分为n-row * m 和 row * m这两大块,然后任选需要取的数目。
dp[k][n][m] = min(dp[k-i][n-row][m]+dp[i][row][m], dp[i][n-row][m]+dp[k-i][row][m]) + m*m;
在cul位置竖切:1 <= cul < m 可以分为n * m-cul 和 n * cul这两大块,然后任选需要取的数目。
dp[k][n][m] = min(dp[k-i][n][m-cul]+dp[i][n][cul], dp[i][n][m-cul]+dp[k-i][n][cul]) + n*n;
中间有重复的判断没有剪掉。蒟蒻,跑了405ms,不打表过不了。 o(╯□╰)o
AC代码:
#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <vector>#define INF 0x3f3f3f3f#define eps 1e-4#define MAXN (10000+10)#define MAXM (1000000)#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rf(a) scanf("%lf", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pf(a) printf("%lf\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 100000007#define LL long long#define lson o<<1, l, mid#define rson o<<1|1, mid+1, r#define ll o<<1#define rr o<<1|1using namespace std;int ans[51][31][31];int dp(int k, int n, int m){ if(ans[k][n][m] != -1) return ans[k][n][m]; else if(k > n*m) ans[k][n][m] = INF; else if(k == n*m || k == 0) ans[k][n][m] = 0; else { ans[k][n][m] = INF; for(int i = 0; i <= k; i++) { for(int row = 1; row < n; row++) ans[k][n][m] = min(ans[k][n][m], min(dp(k-i, n-row, m)+dp(i, row, m), dp(k-i, row, m)+dp(i, n-row, m)) + m*m); for(int cul = 1; cul < m; cul++) ans[k][n][m] = min(ans[k][n][m], min(dp(k-i, n, m-cul)+dp(i, n, cul), dp(k-i, n, cul)+dp(i, n, m-cul)) + n*n); } } return ans[k][n][m];}int main(){ CLR(ans, -1); for(int i = 1; i <= 30; i++) for(int j = 1; j <= 30; j++) for(int k = 0; k <= min(i*j, 50); k++) dp(k, i, j); int t; Ri(t); W(t) { int n, m, k; Ri(n); Ri(m); Ri(k); Pi(ans[k][n][m]); } return 0;}
0 0
- Codeforces 598E Chocolate Bar 【区间dp + 打表】
- Codeforces 598E Chocolate Bar (dp)
- Codeforces 598E:Chocolate Bar(DP)
- Codeforces 598E Chocolate Bar
- Codeforces 598E:Chocolate Bar
- Codeforces 598E Chocolate Bar
- CodeForces 598E Chocolate Bar(DP|记忆化搜索)
- Codeforces Problem 598E - Chocolate Bar
- Educational Codeforces Round 1 E.Chocolate Bar(DP)
- Educational Codeforces Round 1 E Chocolate Bar(dp)
- Coderforce 598 E. Chocolate Bar(DP,记忆化搜索)
- CF 598 E. Chocolate Bar dp题的要害是什么呢?
- 【Educational Codeforces Round 1E】【动态规划-多维DP】Chocolate Bar 矩形巧克力掰开吃的最小成本
- HDU 4301 Divide Chocolate(打表+dp)
- Educational Codeforces Round 1 E. Chocolate Bar(记忆化搜索)
- Codeforces 617B Chocolate 【dp】
- Codeforces 437E The Child and Polygon(区间DP)
- Codeforces#385C_素数打表+dp
- angularjs 下实现即可通过select选择 也可以通过input输入
- java笔记 IO流
- minidwep-gtk无法启动AND启动之后搜不到wifi的解决办法
- OC学习心得之数据类型
- virtualbox 复制方式克隆
- Codeforces 598E Chocolate Bar 【区间dp + 打表】
- 文章标题
- Android性能优化之使用线程池处理异步任务
- FOJ有奖月赛-2015年11月-Problem F 攻占计划
- 线程安全的单例模式
- 删除MFC单文档默认菜单栏的两种方法
- 关于python数组对象“=”的小陷阱
- oc中几种属性特质:nonatomic,copy,retain等
- OC学习心得之异步连接