[CF598E] Chocolate Bar

[CF598E] Chocolate Bar - dp

Description

(n×m) 的巧克力块切若干次,使得形成的若干个碎片的大小和为 (k) 的最小花费,每切的费用是切长的平方 (n,mle 30, k le 50)

Solution

(f[i][j][k]) 表示 (i imes j) 的巧克力得到大小为 (k) 的巧克力的最小花费

暴力切割转移枚举分配

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 55;

int f[N][N][N];

signed main()
{
    memset(f, 0x3f, sizeof f);
    for (int i = 1; i <= 30; i++)
        for (int j = 1; j <= 30; j++)
            if (i * j <= 50)
                f[i][j][i * j] = 0;
    for (int i = 1; i <= 30; i++)
        for (int j = 1; j <= 30; j++)
            f[i][j][0] = 0;
    for (int i = 1; i <= 30; i++)
    {
        for (int j = 1; j <= 30; j++)
        {
            for (int k = 1; k <= 50; k++)
            {
                for (int x = 1; x < i; x++)
                {
                    for (int y = 0; y <= k; y++)
                    {
                        f[i][j][k] = min(f[i][j][k], f[x][j][y] + f[i - x][j][k - y] + j * j);
                    }
                }
                for (int x = 1; x < j; x++)
                {
                    for (int y = 0; y <= k; y++)
                    {
                        f[i][j][k] = min(f[i][j][k], f[i][x][y] + f[i][j - x][k - y] + i * i);
                    }
                }
            }
        }
    }
    int t;
    cin >> t;
    while (t--)
    {
        int n, m, k;
        cin >> n >> m >> k;
        cout << f[n][m][k] << endl;
    }
}
原文地址:https://www.cnblogs.com/mollnn/p/14618767.html