题目链接:http://codeforces.com/contest/598/problem/E
题意:给你一块n*m的巧克力,取出k单位面积最小需要花费的价值;
思路:%q的代码
一直不知道该怎么写,然后看他dfs,记忆话搜索,果然好写多了;
dp,dp[i][j][k]表示当前i行j列大小的巧克力,取出大小为k的最小花费;
枚举切割的行或者列,两个不同面,所取的面积大小;
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cmath> #include<string> #include<queue> #include<algorithm> #include<stack> #include<cstring> #include<vector> #include<list> #include<set> #include<map> using namespace std; #define ll long long #define pi (4*atan(1.0)) #define eps 1e-14 #define bug(x) cout<<"bug"<<x<<endl; const int N=1e7+2,M=1e7+10,inf=1e9+10; const ll INF=1e18+10,mod=1e9+7; /// 数组大小 int dp[50][50][60]; int dfs(int n,int m,int k) { if(k>n*m)return inf; if(dp[n][m][k]<inf)return dp[n][m][k]; if(k==0||k==n*m)return dp[n][m][k]=0; for(int i=1;i<=n/2;i++) { for(int j=0;j<=(i*m,k);j++) { int x=dfs(n-i,m,j); int y=dfs(i,m,k-j); dp[n][m][k]=min(dp[n][m][k],x+y+m*m); } } for(int i=1;i<=m/2;i++) { for(int j=0;j<=(i*n,k);j++) { int x=dfs(n,m-i,j); int y=dfs(n,i,k-j); dp[n][m][k]=min(dp[n][m][k],x+y+n*n); } } return dp[n][m][k]; } int main() { for(int i=0;i<=30;i++) { for(int j=0;j<=30;j++) { for(int k=0;k<=min(i*j,50);k++) dp[i][j][k]=inf; } } int T; scanf("%d",&T); while(T--) { int n,m,k; scanf("%d%d%d",&n,&m,&k); printf("%d ",dfs(n,m,k)); } return 0; }