标签: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