您的位置:首页 > 其它

zoj 2059 The Twin Towers

2012-01-21 20:52 351 查看
/*
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: