CodeForces 598E Chocolate Bar

区间DP预处理。

dp[i][j][k]表示大小为i*j的巧克力块,切出k块的最小代价。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const long long INF=9999999999999999;
const int maxn=60;
long long dp[maxn][maxn][maxn];
int n,m,k;

void f()
{
    for(int i=1;i<=30;i++)
    {
        for(int j=1;j<=30;j++)
        {
            for(int k=1;k<=50;k++)
            {
                dp[i][j][k]=INF;
                if(k>i*j) continue;
                if(k==0)
                {
                    dp[i][j][k]=0;
                    continue;
                }
                if(k==i*j)
                {
                    dp[i][j][k]=0;
                    continue;
                }
                //行割
                for(int s=1;s<=i-1;s++)
                {
                    for(int h=0;h<=k;h++)
                    {
                        if(dp[s][j][h]==INF) continue;
                        if(dp[i-s][j][k-h]==INF) continue;

                        dp[i][j][k]=min(
                                        dp[i][j][k],
                                        dp[s][j][h]+dp[i-s][j][k-h]+j*j
                                        );
                    }
                }

                //列割
                for(int s=1;s<=j-1;s++)
                {
                    for(int h=0;h<=k;h++)
                    {
                        if(dp[i][s][h]==INF) continue;
                        if(dp[i][j-s][k-h]==INF) continue;

                        dp[i][j][k]=min(
                                        dp[i][j][k],
                                        dp[i][s][h]+dp[i][j-s][k-h]+i*i
                                        );
                    }
                }
            }
        }
    }
}

int main()
{
    f();
    int T; scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&m,&k);
        printf("%lld\n",dp[n][m][k]);
    }
    return 0;
}
时间: 2024-10-28 16:11:51

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 standard input output standard output You have a rectangular chocolate bar consisting of n × m single squares. You want to eat exactly k squares, so you ma

Codeforces 490D Chocolate(数论)

题目链接:Codeforces 490D Chocolate 两个种变换方式无疑是减掉一个因子3加上一个因子2和减掉一个因子2,所以从因子的角度出发,如果两组数存在不同的质因子肯定是不可以的.剩下的就是构造答案了. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn = 105; int A

Chocolate Bar

Chocolate Bar Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement There is a bar of chocolate with a height of H blocks and a width of W blocks. Snuke is dividing this bar into exactly three pieces. He can only cut the bar a

codeforces 617B Chocolate

题意: 在给定01串中,问能分割成多少个子串?每个子串只有一个1. dp 1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<set> 7 #include<map> 8 #include<vector> 9 #include<cstr

CodeForces 490D Chocolate

题意: 2块矩形巧克力  如果边长可以整除2  则可以从一半出掰开  吃掉一半  如果可以整除3  则可以从1/3处掰开  吃掉1/3  问  最少吃几次  能使得2块面积相同  输出最后时刻的边长 思路: 面积最多只有10^18  因此形成的面积的种类数最多几万种  我们可以利用面积来暴搜出所有状态  然后找面积相同时的最少步数 PS:数论的方法更好 代码: #include<cstdio> #include<iostream> #include<cstring> #

Codeforces Round #257 (Div. 2)449A - Jzzhu and Chocolate(贪心、数学)

题目链接:http://codeforces.com/problemset/problem/449/A ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943

CodeForces Round 279 D Chocolate

Polycarpus likes giving presents to Paraskevi. He has bought two chocolate bars, each of them has the shape of a segmented rectangle. The first bar is a1 × b1 segments large and the second one is a2 × b2 segments large. Polycarpus wants to give Paras

codeforces 490 D Chocolate

题意:给出a1*b1和a2*b2两块巧克力,每次可以将这四个数中的随意一个数乘以1/2或者2/3,前提是要可以被2或者3整除,要求最小的次数让a1*b1=a2*b2,并求出这四个数最后的大小. 做法:非常显然仅仅跟2跟3有关.所以s1=a1*b1,s2=a2*b2,s1/=gcd(s1,s2),s2/=gcd(s1,s2),然后若s1跟s2的质因子都是2跟3,那么就有解.之后暴力乱搞就好了. #include<map> #include<string> #include<cs

codeforces 555 C Case of Chocolate

一开始题目读错了,还以为可以从任意点为起点向上向左吃. 其实是只能从右边的边界为起点吃. 于是很明显,每一个横坐标最多只能出现一次,否则肯定是当前这个起点的巧克力已经被啃食了. 想到这里就更明显了,对于(xi,n+1-xi),若是向上吃,能够影响它的操作(xj,n+1-xj)肯定满足xj>xi,然后又明显一点,最小的xj肯定能影响到它. 我们来考虑操作(xj,n+1-xj), 若它是往左吃,很显然此时操作(xi,n+1-xi)能吃到被(xj,n+1-xj)吃掉的地方为止. 若它是往上吃呢?很显然