zoj 2059 The Twin Towers

/*
zoj_2059    dp
經典dp!
這題很經典很經典。一開始以爲全部小塊都要用完覺的是很簡單的dp,wa了無數次才發現不是
每一塊都一定要用的。。
完全看別人的思路做的。感覺不太容易想。
dp[i]表示兩塔差值爲i時較低塔的最大高度。
*/
#include <iostream>
#include <cstdio>
#include <limits.h>
#include <string.h>

#define max(a,b) a>b?a:b
using namespace std;
int dp[2001],t[2001];

int main()
{
    int n,i,j,v;
    while( scanf( "%d",&n ) && n>=0 )
    {
        memset( dp,-1,sizeof(dp) );
        memset( t,-1,sizeof(t) );
        dp[0]=t[0]=0;
        while( n-- )
        {
            scanf( "%d",&v );
            for( i=0;i<2001;i++ )
            {
                if( dp[i]!=-1 )
                {
                    if( i+v<2001 ) t[i+v]=max( t[i+v],dp[i] ); //加到高的塔上
                    if( v<i ) t[i-v]=max( t[i-v],dp[i]+v ); //加到低的塔上,且增加以後仍爲較低塔
                    else t[v-i]=max( t[v-i],dp[i]+i ); //加到低的塔上,增加以後變爲較高塔
                }
            }
            memcpy( dp,t,sizeof(t) );
        }
        if( dp[0]==0 )  printf( "Sorry\n" );
        else printf( "%d\n",dp[0] );
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章