当前位置: 代码迷 >> 综合 >> HDU 1069 Monkey and Banana 完全背包+DP .
  详细解决方案

HDU 1069 Monkey and Banana 完全背包+DP .

热度:86   发布时间:2023-09-23 06:49:31.0

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1069

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=30+5;
int rec[maxn][3],N;
int d[maxn][3]; //d[idx][i] 以第idx的矩形为底边,i边为高的,摞最大高 
int DP(int idx,int k)
{int& ans=d[idx][k];if(ans!=-1) return ans;ans=0;for(int nidx=0;nidx<N;nidx++)for(int nk=0;nk<3;nk++){if((rec[idx][(k+1)%3]>rec[nidx][(nk+1)%3]&&rec[idx][(k+2)%3]>rec[nidx][(nk+2)%3])||(rec[idx][(k+2)%3]>rec[nidx][(nk+1)%3]&&rec[idx][(k+1)%3]>rec[nidx][(nk+2)%3]))ans=max(ans,DP(nidx,nk));}ans+=rec[idx][k];return ans;
}
int main()
{int kase=0;while(cin>>N,N){for(int i=0;i<N;i++)for(int j=0;j<3;j++)scanf("%d",&rec[i][j]);memset(d,-1,sizeof(d));int ans=0;for(int i=0;i<N;i++)for(int j=0;j<3;j++)ans=max(ans,DP(i,j));printf("Case %d: maximum height = %d\n",++kase,ans);}return 0;
}