标签:dp
感觉纯dp的题基本上都是给一些数或者物体,求一个最大值什么的
这道题上一层的和下一层的摆放有限制关系,所以要加个标识位,标记原来的顶层是哪一个,然后就是dp了
某一种方块无限供应,即相当于每一种方块,其实都是三种方块,而据题目要求每一种方块最多只能放一块
把坐标按x排序
dp[i][j]表示叠i层,最顶层放第j种方块时的最大高度
则dp[i][j]=max(dp[i][j],dp[i-1][0、1、2....l]+z[j])
然后加个判断条件
if((r[k].x>r[j].x&&r[k].y>r[j].y)||(r[k].y>r[j].x&&r[k].x>r[j].y))刚开始写成了
if(r[k].x>r[j].x&&r[k].y>r[j].y)一直在WA
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; const int inf=1<<30; #define N 105 struct Rec{ int x,y,z; }r[N]; int cmp(Rec a,Rec b){ if(a.x==b.x) return a.y>b.y; return a.x>b.x; } int dp[N][N];//dp[i][j]:前i层块中,第j种方块放在顶层时的最大高度 void init(){ memset(dp,0,sizeof(dp)); } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif int n,cas=1; while(scanf("%d",&n),n){ init(); int l=1,xx,yy,zz; for(int i=0;i<n;i++){ scanf("%d%d%d",&xx,&yy,&zz); r[l].x=xx; r[l].y=yy; r[l++].z=zz; //r[l].x=xx; r[l].y=zz; r[l++].z=yy; r[l].x=yy; r[l].y=zz; r[l++].z=xx; //r[l].x=yy; r[l].y=xx; r[l++].z=zz; r[l].x=zz; r[l].y=xx; r[l++].z=yy; //r[l].x=zz; r[l].y=yy; r[l++].z=xx; } r[0].x=inf;r[0].y=inf;r[0].z=inf; sort(r+1,r+l,cmp); for(int i=1;i<l;i++) {//i是塔的层数 for(int j=i;j<l;j++){//j<i是没有意义的,因为j下面最多放j-1个数,而i代表层数 for(int k=0;k<l;k++){ if((r[k].x>r[j].x&&r[k].y>r[j].y)|| (r[k].y>r[j].x&&r[k].x>r[j].y)) dp[i][j]=max(dp[i][j],dp[i-1][k]+r[j].z); } } } int ans=0; for(int i=1;i<l;i++) { for(int j=i;j<l;j++){ ans=max(ans,dp[i][j]); } } printf("Case %d: maximum height = %d\n",cas++,ans); } }
标签:dp
原文地址:http://blog.csdn.net/lj94093/article/details/45221353