zoukankan      html  css  js  c++  java
  • 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; }
  • 相关阅读:
    for语句及switch case用法示例
    ●验证控件
    ●LinQ to SQL
    ●操作Word
    141107●VS2012的一些使用技巧
    ●Winform拖动无边框窗口、播放音频、启动外部exe程序
    ●操作文件目录及文件
    ●流
    ●事务及异常处理
    ●Winform对话框
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10280274.html
Copyright © 2011-2022 走看看