Codeforces Beta Round #6 (Div. 2 Only) D. Lizards and Basements 2 dp
题目链接:
http://codeforces.com/problemset/problem/6/D
D. Lizards and Basements 2
time limit per test2 secondsmemory limit per test64 megabytes
#### 问题描述
> This is simplified version of the problem used on the original contest. The original problem seems to have too difiicult solution. The constraints for input data have been reduced.
>
> Polycarp likes to play computer role-playing game «Lizards and Basements». At the moment he is playing it as a magician. At one of the last levels he has to fight the line of archers. The only spell with which he can damage them is a fire ball. If Polycarp hits the i-th archer with his fire ball (they are numbered from left to right), the archer loses a health points. At the same time the spell damages the archers adjacent to the i-th (if any) — they lose b (1 ≤ b
> As the extreme archers (i.e. archers numbered 1 and n) are very far, the fire ball cannot reach them. Polycarp can hit any other archer with his fire ball.
>
> The amount of health points for each archer is known. An archer will be killed when this amount is less than 0. What is the minimum amount of spells Polycarp can use to kill all the enemies?
>
> Polycarp can throw his fire ball into an archer if the latter is already killed.
输入
The first line of the input contains three integers n, a, b (3 ≤ n ≤ 10; 1 ≤ b < a ≤ 10). The second line contains a sequence of n integers — h1, h2, ..., hn (1 ≤ hi ≤ 15), where hi is the amount of health points the i-th archer has.
输出
In the first line print t — the required minimum amount of fire balls.
In the second line print t numbers — indexes of the archers that Polycarp should hit to kill all the archers in t shots. All these numbers should be between 2 and n - 1. Separate numbers with spaces. If there are several solutions, output any of them. Print numbers in any order.
样例输入
3 2 1
2 2 2
样例输出
3
2 2 2
题意
现在有n个弓箭手从1到n排成一排,每个人有hi的血量,你只能用火球术去杀死他们,如果你对第i个人使用火球术,将对他造成a点伤害,并且对i-1,i+1造成b点的火焰伤害,你不能直接打第1个和第n个人,问至少需要使用多少次火球术能杀死所有的弓箭手。
题解
首先想到把每人的血量作为状态,这样状态是15^10,QAQ。
正解:dp[i][j][k][l]代表,你现在打算打第i个人,且第i-1个人的血量为j,第i个人的血量为k,第i+1个人的血量为l。
dp[1][h[0]][h[1]][h[2]]=0.
代码
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf
typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=10000000000000000LL;
const double eps=1e-9;
const double PI = acos(-1.0);
//start----------------------------------------------------------------------
int dp[15][20][20][20];
int v[15];
int n,a,b;
struct Node{
int i,j,k,l;
bool operator == (const Node& tmp){
return i==tmp.i&&j==tmp.j&&k==tmp.k&&l==tmp.l;
}
Node(int i,int j,int k,int l):i(i),j(j),k(k),l(l){}
Node(){}
}pre[15][20][20][20];
int main() {
scf("%d%d%d",&n,&a,&b);
for(int i=0;i<n;i++){
scf("%d",&v[i]);
v[i]++;
}
clr(dp,0x3f);
int INF=dp[0][0][0][0];
dp[1][v[0]][v[1]][v[2]]=0;
for(int i=1;i<n-1;i++){
for(int j=v[i-1];j>=0;j--){
for(int k=v[i];k>=0;k--){
for(int l=v[i+1];l>=0;l--){
if(dp[i][j][k][l]>=INF) continue;
if(j==0&&dp[i+1][k][l][v[i+2]]>dp[i][j][k][l]){
dp[i+1][k][l][v[i+2]]=dp[i][j][k][l];
pre[i+1][k][l][v[i+2]]=pre[i][j][k][l];
}
int nj=max(0,j-b);
int nk=max(0,k-a);
int nl=max(0,l-b);
if(dp[i][nj][nk][nl]>dp[i][j][k][l]+1){
dp[i][nj][nk][nl]=dp[i][j][k][l]+1;
pre[i][nj][nk][nl]=Node(i,j,k,l);
}
if(nj==0&&dp[i+1][nk][nl][v[i+2]]>dp[i][j][k][l]+1){
dp[i+1][nk][nl][v[i+2]]=dp[i][j][k][l]+1;
pre[i+1][nk][nl][v[i+2]]=Node(i,j,k,l);
}
}
}
}
}
prf("%d\n",dp[n-2][0][0][0]);
Node tmp=pre[n-2][0][0][0];
while(1){
prf("%d ",tmp.i+1);
if(tmp==Node(1,v[0],v[1],v[2])) break;
tmp=pre[tmp.i][tmp.j][tmp.k][tmp.l];
}
return 0;
}
//end-----------------------------------------------------------------------
Codeforces Beta Round #6 (Div. 2 Only) D. Lizards and Basements 2 dp的更多相关文章
- Codeforces Beta Round #6 (Div. 2 Only) D. Lizards and Basements 2 dfs
D. Lizards and Basements 2 题目连接: http://codeforces.com/contest/6/problem/D Description This is simpl ...
- Codeforces Beta Round #80 (Div. 2 Only)【ABCD】
Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...
- Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】
Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...
- Codeforces Beta Round #79 (Div. 2 Only)
Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...
- Codeforces Beta Round #77 (Div. 2 Only)
Codeforces Beta Round #77 (Div. 2 Only) http://codeforces.com/contest/96 A #include<bits/stdc++.h ...
- Codeforces Beta Round #76 (Div. 2 Only)
Codeforces Beta Round #76 (Div. 2 Only) http://codeforces.com/contest/94 A #include<bits/stdc++.h ...
- Codeforces Beta Round #75 (Div. 2 Only)
Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...
- Codeforces Beta Round #74 (Div. 2 Only)
Codeforces Beta Round #74 (Div. 2 Only) http://codeforces.com/contest/90 A #include<iostream> ...
- Codeforces Beta Round #73 (Div. 2 Only)
Codeforces Beta Round #73 (Div. 2 Only) http://codeforces.com/contest/88 A 模拟 #include<bits/stdc+ ...
随机推荐
- 技巧:利用 Workflow 显示附近的免费 Wi-Fi
得益于 Workflow 自 1.5.3 版本起更新的 Get Content of URL 动作,该 App 的潜力得到了极大的提升.本文分享一种有趣的用法,搜寻附近的免费 Wi-Fi 并择一显示在 ...
- [转]ionic tab view hide tab bar
http://stackoverflow.com/questions/23991852/how-do-i-hide-the-tabs-in-ionic-framework ////// tabs.ht ...
- 矩阵乘法 codevs 1287 矩阵乘法
1287 矩阵乘法 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小明最近在为线性代数而头疼,线性代数确实很抽象 ...
- 边工作边刷题:70天一遍leetcode: day 84-2
要点:这题是combination的应用,从左向右想比从右向左容易. 因为有结果从小到大的要求,暗示用combintion而不是permutation 其实就是从小到大验证因子,每个因子和其对称因子立 ...
- 一致性哈希算法学习及JAVA代码实现分析
1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用,而通过增加机器数目来获得水平横向扩展的方式则 ...
- Linux命令学习-grep
1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局 ...
- sql语句原则
整理尘封的文档,sql语句方面的几条原则再次回顾一下.更详细版本 1. 尽量使用临时表扫描替代全表扫描: 2. 抛弃in和not in语句,使用exists和not exists替代:IN和EXIST ...
- 11Mybatis_mybatis开发Dao的方法
在介绍开发Dao的方法之前先介绍下SqlSession. 1.先介绍一下SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder创建会话工厂SqlSess ...
- 14SpringMvc_在业务控制方法中写入HttpServletRequest,HttpServletResponse等传统web参数(这个知识点知道就好了,不推荐这么去做)
这篇文章解决的问题是怎么在业务方法里面引入我们熟悉的HttpServletRequest和HttpServletRespon? 答案:这种引入传统的web参数的做法不推荐去做,因为这么做会实行高度耦合 ...
- Bitbucket免费的私有仓库
1.官网 https://bitbucket.org/ 2.介绍 知乎:http://www.zhihu.com/question/20053312 建议同时用Bitbucket和Github,理由如 ...