题目链接:http://noi.openjudge.cn/ch0405/6047/
和Uva1629很类似,不过,可能用记忆化难写一点,状态初始化懒得搞了。就用循环好了。
状态描叙也可以修改,那个题目是由于有樱桃的坐标,所以用四维,而这个题目只要长宽,和块数就OK了,三维,然后还是死遍历所有情况的切割。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int dp[25][25][25]; 5 int main() 6 { 7 int n,m,c; 8 for(int i=1; i<=20; i++) 9 { 10 for(int j=1; j<=20; j++) 11 { 12 dp[i][j][1]=i*j; 13 } 14 } 15 for(int i=1; i<=20; i++) 16 { 17 for(int j=1; j<=20; j++) 18 { 19 for(int k=2; k<=20; k++) 20 { 21 for(int l=1; l<i; l++) 22 { 23 for(int p=1; p<k; p++) 24 { 25 if(dp[i][j][k]!=0) dp[i][j][k]=min(max(dp[i-l][j][k-p],dp[l][j][p]),dp[i][j][k]); 26 else dp[i][j][k]=max(dp[i-l][j][k-p],dp[l][j][p]); 27 } 28 } 29 for(int l=1; l<j; l++) 30 { 31 for(int p=1; p<k; p++) 32 { 33 if(dp[i][j][k]!=0) dp[i][j][k]=min(dp[i][j][k],max(dp[i][j-l][k-p],dp[i][l][p])); 34 else dp[i][j][k]=max(dp[i][l][k-p],dp[i][j-l][p]); 35 } 36 } 37 } 38 } 39 } 40 while(cin>>n>>m>>c) 41 { 42 if(n==0&&m==0&&c==0) break; 43 printf("%d\n",dp[n][m][c]);
44 } 45 return 0; 46 }
原文:http://www.cnblogs.com/TreeDream/p/6241101.html