HDU1069(还是dp基础)

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

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

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\n",sb++,ans);


    }

return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值