HDU1069(还是dp基础)

来源:互联网 发布:软件质量控制流程 编辑:程序博客网 时间:2024/05/18 03:16

今天不想说太多废话~因为等下要写自动提交机。不知道能不能成功呢?

题目的意思就是,一个猴子,在叠砖头 ...下面的要严格大于上面的,求叠起来最高能到多少~

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 200int 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\n",sb++,ans);    }return 0;}


0 0
原创粉丝点击