Vijos P1037 搭建双塔(动态规划)
2014-04-07 18:17
155 查看
分析:dp[i][j]表示前I个数字高度差为J的高塔的高度、于是YY出转移方程
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n;
int dp[105][20005];
int num[105];
int main()
{
scanf("%d",&n);
int sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
sum+=num[i];
}
memset(dp,-1,sizeof(dp));
dp[0][0]=0;
int a;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=sum;j++)
{
if(dp[i-1][j]>-1)
dp[i][j]=dp[i-1][j];
if(num[i]>j&&dp[i-1][num[i]-j]>-1)
dp[i][j]=max(dp[i][j],dp[i-1][num[i]-j]+j);
if(j+num[i]<=sum&&dp[i-1][j+num[i]]>-1)
dp[i][j]=max(dp[i][j],dp[i-1][j+num[i]]);
if(j>=num[i]&&dp[i-1][j-num[i]]>-1)
dp[i][j]=max(dp[i][j],dp[i-1][j-num[i]]+num[i]);
}
}
if(dp
[0]>0)
printf("%d\n",dp
[0]);
else printf("Impossible\n");
return 0;
}
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n;
int dp[105][20005];
int num[105];
int main()
{
scanf("%d",&n);
int sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
sum+=num[i];
}
memset(dp,-1,sizeof(dp));
dp[0][0]=0;
int a;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=sum;j++)
{
if(dp[i-1][j]>-1)
dp[i][j]=dp[i-1][j];
if(num[i]>j&&dp[i-1][num[i]-j]>-1)
dp[i][j]=max(dp[i][j],dp[i-1][num[i]-j]+j);
if(j+num[i]<=sum&&dp[i-1][j+num[i]]>-1)
dp[i][j]=max(dp[i][j],dp[i-1][j+num[i]]);
if(j>=num[i]&&dp[i-1][j-num[i]]>-1)
dp[i][j]=max(dp[i][j],dp[i-1][j-num[i]]+num[i]);
}
}
if(dp
[0]>0)
printf("%d\n",dp
[0]);
else printf("Impossible\n");
return 0;
}
相关文章推荐
- Javascript 开发工具
- CF B. Mashmokh and ACM dp
- 《将博客搬至CSDN》
- Python 字符串与unicode对象 关于与区别 encode、decode
- 顺序表查找
- iwconfig android
- socket阻塞和非阻塞的区别
- Eclipse+hibernate+mysql错误:Reading schema error解决
- 浅谈技术工程师的进步
- 错误 error C2678: 二进制“<”: 没有找到接受“const card”类型的左操作数的运算符(或没有可接受的转换)
- 秋日园博园之一-秋色宜人
- adb shell wifi
- DHCP协议与dhcpcd分析
- 浙大校赛我掉进的坑
- 脚本两连发
- java设计模式之模板方法模式Template method
- AlertDialog自定义弹出对话框
- fedora安装sun sdk
- 好汉歌——人才啊
- apt-get install安装软件问题(安装包的依赖库版本过高问题)