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 **************************************/
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3557058.html