lightoj 1126 - Building Twin Towers(dp,递推)
2024-09-01 05:24:59
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1126
题解:一道基础的dp就是简单的递推可以设dp[height_left][height_right],但是这样显然回boom内存,所以不妨直接考虑两座塔之间的差于是便有了dp[i][j]表示考虑到第几个时两座塔差值是多少,然后就是递推了,要么加积木嫁到高的塔上要么就嫁到底的塔上要么都不嫁,这样递推方程就好写了。如果这样还是boom内存的话可以考虑用滚动优化i这一维。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int M = 5e5 + ;
int a[] , dp[][M];
int main() {
int t;
scanf("%d" , &t);
int Case = ;
while(t--) {
int n;
scanf("%d" , &n);
int sum = ;
for(int i = ; i <= n ; i++) {
scanf("%d" , &a[i]);
sum += a[i];
}
sum /= ;
memset(dp , - , sizeof(dp));
dp[][] = ;
int flag = ;
for(int i = ; i <= n ; i++) {
flag = i % ;
for(int j = ; j <= sum ; j++) {
dp[flag][j] = max(dp[flag ^ ][j] , dp[flag][j]);
if(dp[flag ^ ][j] != -) {
dp[flag][j + a[i]] = max(dp[flag][j + a[i]] , dp[flag ^ ][j] + a[i]);
if(j >= a[i]) {
dp[flag][j - a[i]] = max(dp[flag][j - a[i]] , dp[flag ^ ][j]);
}
else {
dp[flag][a[i] - j] = max(dp[flag][a[i] - j] , dp[flag ^ ][j] - j + a[i]);
}
}
}
}
if(dp[flag][] > ) {
printf("Case %d: %d\n" , ++Case , dp[flag][]);
}
else {
printf("Case %d: impossible\n" , ++Case);
}
}
return ;
}
最新文章
- instanceof, isinstance,isAssignableFrom的区别
- nodejs渲染模板
- DEV中dx:ASPxPopupControl 控件的使用(在窗口关闭或隐藏时,清楚文本框中的内容)
- URLDecoder与URLEncoder
- mouseenter(fn)和mouseleave、mouseover和mouseout的的区别
- php.ini xdebug
- 配置yii访问远程数据库
- mysql的时间函数
- IE9中jquery发生Object未定义原因及解决办法
- Jsp笔记(1)
- Hadoop之RPC简单使用(远程过程调用协议)
- ElasticSearch 插件jdbc import(1)-----定时执行
- python之读取配置文件模块configparser(二)参数详解
- HashMap源码分析(一)
- Classification
- Javascript高级编程学习笔记(7)—— 函数
- 挖坑:handoop2.6 开启kerberos(全流程学习记录)
- js json转字符串
- Visual Studio启用64位 IIS Express 解决 x64位的dll 而出现 未能加载文件或程序集“xxxxxxxx”或它的某一个依赖项。试图加载格式不正确的程序。
- Android实现不同Active页面间的跳转