题意:原题在这
有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; }