dp[x][y]记录的是长为x宽为y的长方形所能够达到的最大价值,第一次做的时候想的状态转移是每取一个小矩形,将大矩形按照小矩形宽分割成两个大矩形
但是这样会漏掉情况
应该的做法是
这样状态转移就分为两种策略取最大就行了
#include<iostream>
#include<cstring>
using namespace std;
int dp[1005][1005];
int l[25],c[25],v[25];
int tem;
int DP(int x,int y){
if(x==0||y==0)return 0;
if(dp[x][y])return dp[x][y];
for(int i=0;i<tem;i++){
if(l[i]<=x&&c[i]<=y){
dp[x][y] = max(dp[x][y],v[i]+max(DP(x-l[i],y)+DP(l[i],y-c[i]),DP(x,y-c[i])+DP(x-l[i],c[i])));
}
}
return dp[x][y];
}
int main(){
int N;
cin >> N;
while(N--){
memset(dp,0,sizeof(dp));
int num,x,y;
cin >> num;
cin >> x >> y;
tem = 0;
for(int i=0;i<num;i++){
int a,b,cc;
cin >> a >> b >> cc;
l[tem] = a;
c[tem] = b;
v[tem] = cc;
tem++;
if(a!=b){
l[tem] = b;
c[tem] = a;
v[tem] = cc;
tem++;
}
}
cout<<DP(x,y)<<endl;
}
}