POJ 2161 Chandelier(动态规划)
Description

Input
Output
题目大意:太难说了不写了。
思路: 大概就是递推处理对每个数字组合起来所需要的最小栈吧……思路挺难搞的我已经不会描述了……
转http://hi.baidu.com/billdu/item/50dd9fb49364269619469705
方法就是每到一个数字命令,就枚举前面的元素怎样排列。由于保证了元素数目不多于9,所以圆排列只用枚举9个,时间上绰绰有余。
枚举一个情况下的计算是重点。设定任意一个元素【操作时要占用的最大堆栈数】为m,比如说,组装这个元素以前栈中有5个元素,中间的某一步栈中有12个元素,并且自始至终没超过12个,那么该元素的的M = 7。单个元素的M为1。(这很容易理解……)
然后设某数字指令要拼装的的元素集合为A,元素的安装位置设为p的话(头一个元素是第0个,之后是第1个,依此类推),在这种枚举的情况下目标元素的m = max{ p(E) + m(E), E∈A },因为对于每一个元素,在这之前已经安装了p(E)个元素,安装本元素需要再开m(E)的空间。枚举所有情况,找出最小的目标m记录下来,直到最后最终的元素的m值就是所要用的栈。
输出方案很简单,只需要递归输出,注意顺序既可。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cctype>
using namespace std; const int MAXN = ; char s[MAXN];
int src[MAXN], n; void init() {
int i;
for(i = ; s[i]; ++i)
src[i] = isdigit(s[i]) * (s[i] - '');
n = i;
} int best[MAXN];
int ans[MAXN][];
int pos[];
int stk[MAXN], top; void next(int *arr, int n) {
for(int i = ; i < n; ++i)
if(++arr[i] >= n) arr[i] = ;
} void solve(int n) {
if(src[n] == ) {
best[n] = ;
stk[top++] = n;
return ;
}
int &len = src[n];
for(int i = ; i < len; ++i) pos[i] = i;
for(int i = ; i < len; ++i) {
int tmp = len;
for(int j = ; j < len; ++j)
tmp = max(tmp, j + best[stk[top - len + pos[j]]]);
if(best[n] == || tmp < best[n]) {
best[n] = tmp;
for(int j = ; j < len; ++j) ans[n][j] = stk[top - len + pos[j]];
}
next(pos, len);
}
top -= len;
stk[top++] = n;
} void dfs(int n) {
for(int i = ; i < src[n]; ++i)
if(src[ans[n][i]]) dfs(ans[n][i]);
else putchar('a');
printf("%d", src[n]);
} int main() {
scanf("%s", s);
init();
for(int i = ; i < n; ++i) solve(i);
printf("%d\n", best[n - ]);
dfs(n - );
puts("");
}
POJ 2161 Chandelier(动态规划)的更多相关文章
- POJ 2161 Chandelier(树状DP)
一.题意 首先是对题目的翻译.给出一个长长的字符串,这个字符串描述了一个吊灯.对于给字符串只有两种操作数——'a'为一个吊灯灯珠,将改灯珠入栈,一位阿拉伯数字K,代表一个环,将把该数字前面k位数都出栈 ...
- poj 3783 Balls 动态规划 100层楼投鸡蛋问题
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4098409.html 题目链接:poj 3783 Balls 动态规划 100层楼投鸡蛋问题 ...
- poj 2229 一道动态规划思维题
http://poj.org/problem?id=2229 先把题目连接发上.题目的意思就是: 把n拆分为2的幂相加的形式,问有多少种拆分方法. 看了大佬的完全背包代码很久都没懂,就照着网上的写了动 ...
- [POJ 2063] Investment (动态规划)
题目链接:http://poj.org/problem?id=2063 题意:银行每年提供d种债券,每种债券需要付出p[i]块钱,然后一年的收入是v[i],到期后我们把本金+收入取出来作为下一年度本金 ...
- [POJ 2923] Relocation (动态规划 状态压缩)
题目链接:http://poj.org/problem?id=2923 题目的大概意思是,有两辆车a和b,a车的最大承重为A,b车的最大承重为B.有n个家具需要从一个地方搬运到另一个地方,两辆车同时开 ...
- POJ 1088 滑雪 -- 动态规划
题目地址:http://poj.org/problem?id=1088 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...
- poj 1159 Palindrome - 动态规划
A palindrome is a symmetrical string, that is, a string read identically from left to right as well ...
- poj 2385【动态规划】
poj 2385 Apple Catching Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14007 Accepte ...
- poj 1837 Balance 动态规划 (经典好题,很锻炼思维)
题目大意:给你一个天平,并给出m个刻度,n个砝码,刻度的绝对值代表距离平衡点的位置,并给出每个砝码的重量.达到平衡状态的方法有几种. 题目思路:首先我们先要明确dp数组的作用,dp[i][j]中,i为 ...
随机推荐
- deep learning学习记录三
deep learning,这几年有多火!! imagenet比赛,大家今年都是基于去年的基础上改进和应用的,效果比去年提升当然. 在deep learning方向,hinton, benjio, l ...
- 23.POI导出
POI导出 XSSFWorkbook 对应Excel2007版本及以上 HSSFWorkbook 对应Excel2003版本 还要注意一点,不要用Swagger-ui测试导出的表格,这样的表格文件都是 ...
- poj 1236 Network of Schools : 求需要添加多少条边成为强连通图 tarjan O(E)
/** problem: http://poj.org/problem?id=1236 缩点后入度为0的点的总数为需要发放软件的学校个数 缩点后出度为0的点的总数和入度为0的点的总数的最大值为需要增加 ...
- Java基础题:集合、String、性能、线程
转载自:Java基础题 https://yq.aliyun.com/articles/601786?utm_content=m_1000001149
- 剑指offer—二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- IDEA无法引入已经创建的类
解决办法: 清理一下缓存: File->Invalidate Caches/Restart... OVER!
- github 常用
1.创建KEY,这个文件生成完了后,要保存好公钥和私钥文件 ssh-keygen -t rsa -C "abc@mail.com" 2.github上添加ssh密钥 3.拷贝公钥信 ...
- 关于Vue的Render的讲解
首先我们传统的对于DOM的操作基本上都是通过js直接的获取一个节点,然后对DOM进行增加或者是删除.而Vue的Render这个函数是通过js虚拟的添加dom节点,然后虚拟的添加到html节点上去. 算 ...
- ruby 可枚举模块Enumerable
Enumerable模块提供了遍历,搜索,比较,排序等方法.如果我们自定义的类需要实现这些方法,必须实现一个each方法.如果需要使用max,min,sort等方法,因为这些方法是集合的元素之间的排序 ...
- ansible自动化运维入门
1.ansible的安装 1)使用源码安装Python3.5 安装支持包 yum -y install lrzsz vim net-tools gcc gcc-c++ ncurses ncurses- ...