「Codeforces」598E (区间dp)

题意:原题在这

有t组输入,每次有n*m的巧克力,要吃k块
只能整行切,代价是长度的平方
求最小代价

思路:

枚举切几块和该情况下横切还是纵切

特判:
  切0块、没有巧克力、切一整块

暴力五重循环233

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define inf 99999999
using namespace std;
int t,n,m,k;
int dp[55][55][60];

int main()
{
    for(int i=0;i<=30;i++)
    for(int j=0;j<=30;j++)
    for(int k=0;k<=50;k++)
    {
        dp[i][j][k]=inf;
        if(k==0||i*j==0||i*j==k) dp[i][j][k]=0;
        for(int c=0;c<=k;c++)//切几块
        {
            for(int x=1;x<i;x++) //切竖行
            {
                dp[i][j][k]=min(dp[i][j][k],dp[x][j][c]+dp[i-x][j][k-c]+j*j);
            }
            for(int y=1;y<j;y++) //切横行
            {
                dp[i][j][k]=min(dp[i][j][k],dp[i][y][c]+dp[i][j-y][k-c]+i*i);
            }
        }
    }
    cin>>t;
    for(int i=1;i<=t;i++) 
    {
        cin>>n>>m>>k;
        cout<<dp[n][m][k]<<endl;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/LocaEtric/p/9614915.html
今日推荐