[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;
}
}