题目链接:

http://codeforces.com/problemset/problem/6/D

D. Lizards and Basements 2

time limit per test2 seconds
memory 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的更多相关文章

  1. 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 ...

  2. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

  3. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

  4. Codeforces Beta Round #79 (Div. 2 Only)

    Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...

  5. Codeforces Beta Round #77 (Div. 2 Only)

    Codeforces Beta Round #77 (Div. 2 Only) http://codeforces.com/contest/96 A #include<bits/stdc++.h ...

  6. Codeforces Beta Round #76 (Div. 2 Only)

    Codeforces Beta Round #76 (Div. 2 Only) http://codeforces.com/contest/94 A #include<bits/stdc++.h ...

  7. Codeforces Beta Round #75 (Div. 2 Only)

    Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...

  8. Codeforces Beta Round #74 (Div. 2 Only)

    Codeforces Beta Round #74 (Div. 2 Only) http://codeforces.com/contest/90 A #include<iostream> ...

  9. Codeforces Beta Round #73 (Div. 2 Only)

    Codeforces Beta Round #73 (Div. 2 Only) http://codeforces.com/contest/88 A 模拟 #include<bits/stdc+ ...

随机推荐

  1. HDU 1576 A/B【扩展欧几里德】

    设A/B=x,则A=Bx n=A%9973=A-9973*y=Bx-9973*y 用扩展欧几里德求解 #include<stdio.h> #include<string.h> ...

  2. DoTween(HOTween V2) 教程

    DoTween资料 官方网站:http://dotween.demigiant.com/ 下载地址:http://dotween.demigiant.com/download.php 快速开始:htt ...

  3. IO流的练习3 —— 复制多级文件夹下的指定文件并改名

    需求:复制指定目录下的指定文件,并修改后缀名. 指定的文件是:.java文件. 指定的后缀名是:.jad 数据源所在文件夹:C:\Users\Administrator\Desktop\记录 目的地所 ...

  4. java10-1 Object类

    Object:类      Object 是类层次结构的根类.每个类都使用 Object 作为超类. 每个类都直接或者间接的继承自Object类. Object类的方法: public int has ...

  5. 经典71道Android试题及答案

    本文为开发者奉献了70道经典Android面试题加答案--重要知识点几乎都涉及到了,你还等啥,赶紧收藏吧!! 1. 下列哪些语句关于内存回收的说明是正确的? (b) A. 程序员必须创建一个线程来释放 ...

  6. 微软职位内部推荐-Software Engineer II

    微软近期Open的职位: Job Description Group: Search Technology Center Asia (STCA)/Search Ads Title: SDEII-Sen ...

  7. [服务]ftp主动模式和被动模式

    经常忘记这个东西.于是总结下这东西感受下这个协议. FTP连接方式 控制连接:标准端口为21,用于发送FTP命令信息 数据连接:标准端口为20,用于上传.下载数据 数据连接的建立类型: 主动模式:服务 ...

  8. SSH公钥认证+优化

    一 ssh公钥认证流程: sshclinet机器:产生公私钥(公钥相当于一把锁) sshclient:将公钥发给sshserver(抛出锁子) sshclinet去连sshserver不需要密钥   ...

  9. HttpClient通过Post上传文件(转)

    在之前一段的项目中,使用Java模仿Http Post方式发送参数以及文件,单纯的传递参数或者文件可以使用URLConnection进行相应的处理. 但是项目中涉及到既要传递普通参数,也要传递多个文件 ...

  10. python 线性回归示例

    说明:此文的第一部分参考了这里 用python进行线性回归分析非常方便,有现成的库可以使用比如:numpy.linalog.lstsq例子.scipy.stats.linregress例子.panda ...