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

 

你可能感兴趣的:(dp)