• hdu1069线性dp


    /*
    dp[i]:取第i个方块时最多可以累多高
    */
    #include<bits/stdc++.h>
    using namespace std;
    struct node{
        int x,y,z;
        bool operator<(const node  & a)const {
            if(x==a.x)return y>a.y;
            return x>a.x; 
        } //按照x从大到小排,x相同的话就按y从小到大排 
    }block[1000];
    int dp[1000],tot;
     
    int main(){
        int x,y,z,n,tt=0;
        while(scanf("%d",&n),n){
            tt++;tot=0;
            memset(dp,0,sizeof dp);
            
            for(int i=1;i<=n;i++){//最多有六种形态,能够保证一个块不会以两个形态被使用两次 
                scanf("%d%d%d",&x,&y,&z);
                block[++tot].x=x;block[tot].y=y;block[tot].z=z;
                block[++tot].x=y;block[tot].y=x;block[tot].z=z;
                block[++tot].x=y;block[tot].y=z;block[tot].z=x;
                block[++tot].x=z;block[tot].y=y;block[tot].z=x;
                block[++tot].x=z;block[tot].y=x;block[tot].z=y;
                block[++tot].x=x;block[tot].y=z;block[tot].z=y;
            }
            
            sort(block+1,block+1+tot);
    
            dp[1]=block[1].z;
            for(int i=2;i<=tot;i++){
                int Max=0;
                for(int j=1;j<i;j++){
                    if(block[i].x<block[j].x && block[i].y<block[j].y)
                        Max=max(Max,dp[j]);//找出高度最大的基底 
                    //dp[i]=max(dp[i],dp[j]+block[i].z);为什么不可以这样?
           } dp[i]
    =Max+block[i].z; } int ans=0; for(int i=1;i<=tot;i++)ans=max(ans,dp[i]); printf("Case %d: maximum height = %d ",tt,ans); } return 0; }
  • 相关阅读:
    信息收集之Nmap
    namp ssl秘钥安全性检测
    msf测试tomcat
    MobaXterm root用户连接虚拟机时出现Access denied
    最长公共子序列C
    web 入门58-70
    oninput,onpropertychange,onchange的用法和区别
    JavaScript判断图片是否加载完成的三种方式---转
    node.js
    SPP-Net
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10280274.html
Copyright © 2020-2023  润新知