您的位置:首页 > 其它

HDU_3127 WHUgirls(DP)

2011-09-05 14:44 375 查看
  大连网络赛之前做的一次模拟赛上见到,开始想用贪心做,但没想到好的贪心策略,之后放下。这几天又重新看了看这道题,有看了看网上的题解,终于把这题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

;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: