HDU_3127 WHUgirls(DP)

  大连网络赛之前做的一次模拟赛上见到,开始想用贪心做,但没想到好的贪心策略,之后放下。这几天又重新看了看这道题,有看了看网上的题解,终于把这题A了!。

思路:

如图:

布的总大小为(xx, yy)。剪下的面积为(x, y); 注意这句话: a machine which can cut one cloth into exactly two smaller rectangular pieces horizontally or vertically

所以可行的剪法有四种,即:


由上图可得动态转移方程为:

dp[i][j] = max(dp[i][j], dp[i-x][j] + dp[x][j-y] + c[k]);
dp[i][j] = max(dp[i][j], dp[i][j-y] + dp[i-x][y] + c[k]);

dp[i][j] = max(dp[i][j], dp[i-y][j] + dp[y][j-x] + c[k]);
dp[i][j] = max(dp[i][j], dp[i][j-x] + dp[i-y][x] + c[k]);

My Code:

#include <iostream>
#include
<cstdio>
#include
<cstring>
#pragma comment(linker,"/STACK:65536000");

using namespace std;

const int N = 1002;

int dp[N][N];
int w[11][2], c[11];

int main()
{
//freopen("data.in", "r", stdin);

int t;
cin
>> t;
while(t--)
{
int n, a, b, x, y, i, j, k;
cin
>> n >> a >> b;
memset(w,
0, sizeof(w));
memset(c,
0, sizeof(c));
for(i = 1; i <= n; i++)
cin
>> w[i][0] >> w[i][1] >> c[i];
for(i = 0; i <= a; i++)
for(j = 0; j <= b; j++)
dp[i][j]
= 0;
for(i = 0; i <= a; i++)
{
for(j = 0; j <= b; j++)
{
for(k = 1; k <= n; k++)
{
x
= w[k][0];
y
= w[k][1];
if(i >= x && j >= y)
{
dp[i][j]
= max(dp[i][j], dp[i-x][j] + dp[x][j-y] + c[k]);
dp[i][j]
= max(dp[i][j], dp[i][j-y] + dp[i-x][y] + c[k]);
}
x
= w[k][1];
y
= w[k][0];
if(i >= x && j >= y)
{
dp[i][j]
= max(dp[i][j], dp[i-x][j] + dp[x][j-y] + c[k]);
dp[i][j]
= max(dp[i][j], dp[i][j-y] + dp[i-x][y] + c[k]);
}
}
}
}
printf(
"%d\n", dp[a][b]);
}
return 0;
}



posted @ 2011-09-05 14:44  AC_Von  阅读(237)  评论(0编辑  收藏  举报