Codeforces 598E:Chocolate Bar
2 seconds
256 megabytes
standard input
standard output
You have a rectangular chocolate bar consisting of n × m single squares. You want to eat exactly k squares,
so you may need to break the chocolate bar.
In one move you can break any single rectangular piece of chocolate in two rectangular pieces. You can break only by lines between squares: horizontally or vertically. The cost of breaking is equal to square of the break length.
For example, if you have a chocolate bar consisting of 2 × 3 unit squares then you can break it horizontally and get two 1 × 3 pieces
(the cost of such breaking is 32 = 9),
or you can break it vertically in two ways and get two pieces: 2 × 1 and 2 × 2 (the
cost of such breaking is 22 = 4).
For several given values n, m and k find
the minimum total cost of breaking. You can eat exactly k squares of chocolate if after all operations of breaking there is a set
of rectangular pieces of chocolate with the total size equal to k squares. The remaining n·m - ksquares
are not necessarily form a single rectangular piece.
The first line of the input contains a single integer t (1 ≤ t ≤ 40910) —
the number of values n, m and k to
process.
Each of the next t lines contains three integers n, m and k (1 ≤ n, m ≤ 30, 1 ≤ k ≤ min(n·m, 50)) —
the dimensions of the chocolate bar and the number of squares you want to eat respectively.
For each n, m and k print
the minimum total cost needed to break the chocolate bar, in order to make it possible to eat exactly ksquares.
4
2 2 1
2 2 3
2 2 2
2 2 4
5
5
4
0
In the first query of the sample one needs to perform two breaks:
- to split 2 × 2 bar into two pieces of 2 × 1 (cost
is 22 = 4), - to split the resulting 2 × 1 into two 1 × 1 pieces
(cost is 12 = 1).
In the second query of the sample one wants to eat 3 unit squares. One can use exactly the same strategy as in the first query of the sample.
一个n*m大的巧克力,你要吃k个单元的巧克力。每次切分都会有切的那条边长度平方的代价。问最小代价。
自己DP题目做得太少。
从最简单状况考虑,一块巧克力被切分,就分成了两块。这样从小到大,考虑各种情况(切的哪条边、两块中每一块吃多少个巧克力)递推。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; #define INF 1e9+7 int dp[32][32][52]; int main()
{
//freopen("i.txt","r",stdin);
//freopen("o.txt","w",stdout);
int i, j, k, h, m;
for (i = 0; i <= 30; i++)
{
for (j = 0; j <= 30; j++)
{
for (k = 0; k <= 50; k++)
{
if (k == i*j || k == 0)
{
dp[i][j][k] = 0;
}
else
{
dp[i][j][k] = INF;
}
for (h = 0; h <= k; h++)
{
for (m = 1; m < j; m++)
dp[i][j][k] = min(dp[i][j][k], dp[i][m][h] + dp[i][j - m][k - h] + i*i);
for (m = 1; m < i; m++)
dp[i][j][k] = min(dp[i][j][k], dp[m][j][h] + dp[i - m][j][k - h] + j*j);
}
}
}
} scanf("%d", &k);
while (k--)
{
scanf("%d%d%d", &i, &j, &h);
printf("%d\n", dp[i][j][h]);
}
//system("pause");
return 0;
}
看到好多时间特别短的是深搜,然后把当前值记录下来,不仅仅是这道题,上一道深搜的题目也是,有的时候为了减少时间,不一定全部预处理,用到哪个再求哪个,然后把求到的记录下来,为了下次询问使用。
Codeforces 598E:Chocolate Bar的更多相关文章
- codeforces 598E E. Chocolate Bar(区间dp)
题目链接: E. Chocolate Bar time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Codeforces 617B:Chocolate(思维)
题目链接http://codeforces.com/problemset/problem/617/B 题意 有一个数组,数组中的元素均为0或1 .要求将这个数组分成一些区间,每个区间中的1的个数均为1 ...
- Codeforces Problem 598E - Chocolate Bar
Chocolate Bar 题意: 有一个n*m(1<= n,m<=30)的矩形巧克力,每次能横向或者是纵向切,且每次切的花费为所切边长的平方,问你最后得到k个单位巧克力( k <= ...
- Educational Codeforces Round 1 E. Chocolate Bar 记忆化搜索
E. Chocolate Bar Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/598/prob ...
- Educational Codeforces Round 1 E. Chocolate Bar dp
题目链接:http://codeforces.com/contest/598/problem/E E. Chocolate Bar time limit per test 2 seconds memo ...
- Codeforces 450C:Jzzhu and Chocolate(贪心)
C. Jzzhu and Chocolate time limit per test: 1 seconds memory limit per test: 256 megabytes input: st ...
- codeforces 490 D Chocolate
题意:给出a1*b1和a2*b2两块巧克力,每次可以将这四个数中的随意一个数乘以1/2或者2/3,前提是要可以被2或者3整除,要求最小的次数让a1*b1=a2*b2,并求出这四个数最后的大小. 做法: ...
- 学习笔记:Tab Bar 控件使用详解
注意这里是:Tab Bar 不是Tab Bar Controller. Tab bar是继承UIView,所以可以添加到ViewController里.是View就可以add到另一个View上去.Ta ...
- Chocolate Bar(暴力)
Chocolate Bar Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement There is ...
随机推荐
- arc066E - Addition and Subtraction Hard
题目链接 题目大意 给定一个只含加减和数字的表达式,在其中添加括号,使其值最大. 解题思路 显然,只有减号后面的括号会使其中表达式的值取反. 然后只有已经有左括号时才能加入右括号. 所以用\(f_0\ ...
- CSS - 块状元素、内联元素和内联块状元素
在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素(block).内联元素(又叫行内元素,inline)和内联块状元素(inline-block). 1. 常用的块状元素有: < ...
- 容器远程访问vnc--CentOS 6.8安装和配置VNC
对于用惯了WIN系统的朋友来说,没有图形化操作界面的Linux用起来实在太难受了.实际上,Linux也是有图形化操作界面的,这就是VNC.接下来本文将告诉大家如何在CentOS 6.8下安装和配置 V ...
- list中的对象或者map中的版本号排序 version排序
经常会用到版本号排序,直接把他封装成一个工具用起来比较方便. List<A> aList = new ArrayList<>(); ...aList 赋值 ... Collec ...
- 吴裕雄 python 神经网络——TensorFlow训练神经网络:不使用指数衰减的学习率
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_NODE = 784 ...
- Docker 安装 Logstash
使用同版本镜像 7.4.1 1.下载Logstash镜像 docker pull logstash: #查看镜像 docker images 2.编辑logstash.yml配置文件logstash. ...
- yp寒假训练一
19年东北四省省赛 做了J G C 补了E H J签到题 G 题意: 给n个正方形的两个斜对角点坐标,问最小的移动可以重叠(移动上下左右一格) 思路: 一开始想的是中心pos移动,但是可能有小数,而且 ...
- 【JS 移动端】获取设置页面大小
获取设置页面大小 function getMobileData() { var ismobile = false; browser = { versions: function () { var u ...
- java 第三次课后作业
1.java字段初始化的规律 public class gouzao { public static void main(String[] args) { test te=new test(); Sy ...
- Session服务器之Session复制!
全部运行在Tomcat下 第一台主机:192.168.200.131 安装nginx 修改hosts文件 [root@localhost ~]# vim /etc/hosts 192.168.200 ...