sdut1933WHUgirls(dp)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1933
矩形的dp一般挺类似 大的矩形都是由小的推出来的 对于一个长为i 宽为j 的 矩形 分别枚举把这n个给出的小矩形放入里面后 取一个最优值
dp[i][j] = max(dp[i][j],dp[i-x][j]+dp[x][j-y],dp[i][j-y]+dp[i-x][y]) 交换小矩形的长宽 再取一次
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<cmath> 7 #include<vector> 8 #include<set> 9 using namespace std; 10 #define LL long long 11 int xi,yi; 12 int x[22],y[22],p[22]; 13 LL dp[1010][1010],n; 14 int main() 15 { 16 int i,j,t,g; 17 cin>>t; 18 while(t--) 19 { 20 memset(dp,0,sizeof(dp)); 21 cin>>n>>xi>>yi; 22 for(i = 0; i < n ;i++) 23 { 24 cin>>x[i]>>y[i]>>p[i]; 25 } 26 LL maxz=0; 27 for(i = 1 ; i <= xi ; i++) 28 for(j = 1; j <= yi ; j++) 29 { 30 for(g = 0 ; g < n ;g++) 31 { 32 if(i>=x[g]&&j>=y[g]) 33 { 34 dp[i][j] = max(dp[i][j],max(dp[i-x[g]][j]+dp[x[g]][j-y[g]],dp[i][j-y[g]]+dp[i-x[g]][y[g]])+p[g]); 35 } 36 swap(x[g],y[g]); 37 if(i>=x[g]&&j>=y[g]) 38 dp[i][j] = max(dp[i][j],max(dp[i-x[g]][j]+dp[x[g]][j-y[g]],dp[i][j-y[g]]+dp[i-x[g]][y[g]])+p[g]); 39 } 40 maxz = max(dp[i][j],maxz); 41 } 42 cout<<maxz<<endl; 43 } 44 return 0; 45 } 46 47 48 49 /************************************** 50 Problem id : SDUT OJ 1933 51 User name : shang 52 Result : Accepted 53 Take Memory : 8444K 54 Take Time : 480MS 55 Submit Time : 2014-02-18 17:17:13 56 **************************************/