题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3127
对于一个小矩形,有两种切割方式(上下):1、在xx上切x,在yy上切y;2、在xx上切y,在yy上切x
故有:
1、在xx上切x,在yy上切y;
dp[i][j]=max(dp[i][j],max(dp[x][j-y]+dp[i-x][j],dp[i][j-y]+dp[i-x][y])+value);
2、在xx上切y,在yy上切x
dp[i][j]=max(dp[i][j],max(dp[y][j-x]+dp[i-y][j],dp[i][j-x]+dp[i-y][x])+value);
其中dp[i][j]表示(0,0)到(i,j)切出小矩阵的价值和;

1 #include<iostream> 2 const int N=1010; 3 using namespace std; 4 5 struct Node{ 6 int x,y; 7 int value; 8 }node[N]; 9 int dp[N][N]; 10 11 int main(){ 12 int _case; 13 scanf("%d",&_case); 14 while(_case--){ 15 int N,X,Y; 16 scanf("%d%d%d",&N,&X,&Y); 17 for(int i=0;i<N;i++){ 18 scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].value); 19 } 20 memset(dp,0,sizeof(dp)); 21 for(int i=1;i<=X;i++){ 22 for(int j=1;j<=Y;j++){ 23 for(int k=0;k<N;k++){ 24 if(node[k].x<=i&&node[k].y<=j){ 25 dp[i][j]=max(dp[i][j],max(dp[node[k].x][j-node[k].y]+dp[i-node[k].x][j],dp[i][j-node[k].y]+dp[i-node[k].x][node[k].y])+node[k].value); 26 } 27 if(node[k].x<=j&&node[k].y<=i){ 28 dp[i][j]=max(dp[i][j],max(dp[node[k].y][j-node[k].x]+dp[i-node[k].y][j],dp[i][j-node[k].x]+dp[i-node[k].y][node[k].x])+node[k].value); 29 } 30 } 31 } 32 } 33 printf("%d\n",dp[X][Y]); 34 } 35 return 0; 36 }