链接:点击打开链接
题意:给出一个n*m的巧克力,想要分出k个单位的巧克力,可以横切和竖切,但每次必须切到底,每次的费用为切的那条边的平方,问最小费用
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int dp[35][35][55];
int main(){ //dp[i][j][k]表示i*j的巧克力分成k份的代价
int n,m,k,t,i,j,x,y;
memset(dp,INF,sizeof(dp));
for(i=1;i<=30;i++){
for(j=1;j<=30;j++){
for(k=0;k<=50;k++){
if(i*j==k||k==0)
dp[i][j][k]=0;
for(x=0;x<=k;x++){ //其实就是枚举每一条边,进行横切和竖切
for(y=1;y<j;y++)
dp[i][j][k]=min(dp[i][j][k],dp[i][y][x]+dp[i][j-y][k-x]+i*i);
for(y=1;y<i;y++)
dp[i][j][k]=min(dp[i][j][k],dp[y][j][x]+dp[i-y][j][k-x]+j*j);
}
}
}
}
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&k);
printf("%d\n",dp[n][m][k]);
}
return 0;
}