[CF598E] Chocolate Bar - dp

Description

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

Solution

\(f[i][j][k]\) 表示 \(i \times 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;
    }
}

相关文章:

  • 2022-02-10
  • 2022-02-11
  • 2021-11-04
  • 2021-11-22
  • 2022-12-23
  • 2022-12-23
  • 2021-08-16
  • 2021-08-22
猜你喜欢
  • 2022-03-05
  • 2022-12-23
  • 2021-07-05
  • 2022-02-13
  • 2021-11-20
  • 2021-11-08
  • 2022-01-19
相关资源
相似解决方案