HLG 1240 WHUgirls
题意: 给一个固定大小的布料,给出n 个固定的尺寸,每个尺寸的布料对应一定的价值,问如何裁剪原来的布料能可以获得最大的价值。
分析: 应为每个尺寸的布料都对应四种切法,(蓝色部分)
所以状态转移方程为:
dp[i][j]=max(dp[i][j],max(d[i-ll][j]+d[ll][j-ww],d[i][j-ww]+d[i-ll][ww])+p);
dp[i][j]=max(dp[i][j],max(d[i-ww][j]+d[ww][j-ll],d[i][j-ll]+d[i-ww][ll])+p);
View Code
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) int d[1002][1002]; int max(int a,int b) { return a>b?a:b; } struct node { int l,w,p; }q[12]; int main() { int t,ll,wi,n; int i,j,k; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&ll,&wi); clr(d); for(i=0;i<n;i++) scanf("%d%d%d",&q[i].l,&q[i].w,&q[i].p); for(i=1;i<=ll;i++) for(j=1;j<=wi;j++) { for(k=0;k<n;k++) { if(i>=q[k].l&&j>=q[k].w) d[i][j]=max(d[i][j],max(d[i-q[k].l][j]+d[q[k].l][j-q[k].w],d[i][j-q[k].w]+d[i-q[k].l][q[k].w])+q[k].p); if(i>=q[k].w&&j>=q[k].l) d[i][j]=max(d[i][j],max(d[i-q[k].w][j]+d[q[k].w][j-q[k].l],d[i][j-q[k].l]+d[i-q[k].w][q[k].l])+q[k].p); } } printf("%d\n",d[ll][wi]); } return 0; }