UVA437 (DAG)動態規劃
阿新 • • 發佈:2018-12-13
UVA437
紫書上的動態規劃的題目,二元環。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; const int maxn=35; const int inf =0x3f3f3f; typedef long long ll; int n; int block[maxn][3],d[maxn][3]; void getdim(int* v,int b,int dim) { int idx=0; for(int i=0;i<3;i++) { if(i!=dim) v[idx++]=block[b][i]; } return ; } int dp(int i,int j) { int& ans=d[i][j]; if(ans>0) return ans; int tmp1[2],tmp2[2]; getdim(tmp1,i,j); for(int a=0;a<n;a++) { for(int b=0;b<3;b++) { getdim(tmp2,a,b); if(tmp1[0]<tmp2[0] && tmp1[1]<tmp2[1]) ans=max(ans,dp(a,b)); } } ans+=block[i][j]; return ans; } int main() { int kase=0; while(~scanf("%d",&n) && n) { for(int i=0;i<n;i++) { for(int j=0;j<3;j++) scanf("%d",&block[i][j]); sort(block[i],block[i]+3); } int ans=0; memset(d,0,sizeof(d)); 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; }