今天不想说太多废话~由于等下要写自己主动提交机。
不知道能不能成功呢?
题目的意思就是,一个猴子,在叠砖头 ...以下的要严格大于上面的。求叠起来最高能到多少~
n非常少,n^2算法毫无压力~话说dp的n一般都小。
我们先排序。拍完序的状态转移方程是: dp[i]=max(dp[j])+z[i],0<=i<=j。记得要等于。
之后再线性遍历一下找出max ,不然还是WA~
还有在读入的时候,一个砖生成六个砖,能够自己暴力模拟一下。我是走循环的~
这个循环条件我也不知道怎么说。我仅仅是认为推断两两不相等好麻烦,我这个映射在小范围没出现过问题。
/*********************************************************** > OS : Linux 3.2.0-60-generic #91-Ubuntu > Author : yaolong > Mail : dengyaolong@yeah.net > Time : 2014年06月03日 星期二 07:11:21 **********************************************************/ #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<vector> using namespace std; #define maxn 200 int x[maxn]; int y[maxn]; int z[maxn]; int dp[maxn]; int I[maxn]; int cmp(int i,int j){ if(x[i]!=x[j]){ return x[i]<x[j]; } return y[i]<y[j]; } int main(){ int n,i,j,tmp[3]; x[0]=y[0]=z[0]=0; int sb=1; while(cin>>n&&n){ int ind=1; for(i=0;i<n;i++){ for (j=0;j<3;j++){ cin>>tmp[j]; } for(int l=0;l<3;l++) for(int k=0;k<3;k++) for(int m=0;m<3;m++){ if(l*l+k*k+m*m==5){ x[ind]=tmp[l]; y[ind]=tmp[k];z[ind]=tmp[m];ind++; } } } for(i=0;i<ind;i++){ I[i]=i; } sort(I,I+ind,cmp); memset(dp,0,sizeof(dp)); for(i=0;i<ind;i++){ int mmax=0; for(j=0;j<=i;j++){ if(x[I[j]]<x[I[i]]&&y[I[j]]<y[I[i]]) mmax=max(dp[I[j]],mmax); } dp[I[i]]=z[I[i]]+mmax; } int ans=0; for(i=0;i<ind;i++){ ans=max(ans,dp[i]); } //for (i=1;i<ind;i++) printf("Case %d: maximum height = %d ",sb++,ans); } return 0; }