zoukankan      html  css  js  c++  java
  • 剑圣的逃跑

    描述

    在一场ORC对NightElf比赛中(ORC必胜!),ORC全军覆没,只留下英雄--剑圣。
    已知这个地图上有很多分叉,而剑圣正好在最顶端。在每个分叉处有敌人的军队封锁。设剑圣在i行j列,则他可以到达i+1行j列,i+1行j+1列,i+1行j+2列。每支敌人的军队的力量不同。剑圣可以使用魔法“疾风步”(剑圣的保命魔法)来通过一个关卡而不用受到伤害。剑圣需要你来找出一条路线,使他受到的伤害最少。

    输入

    第一行为关卡层数n(n<200)和剑圣可以使用“疾风步”的次数q(q<=n)。
    第二行为剑圣的初始生命m(m<32767)。
    以下n行为地图上军队力量(整数)的描述(若某个关卡上的军队力量为p,则剑圣不用“疾风步”时通过此关卡须受到p点伤害)。

    输出

    一行,若剑圣仍活着则输出他剩余的生命值,否则输出“DEAD”。

    样例

    输入

    3 1
    10
    1
    1 2 3
    1 2 3 4 5

    输出

    8
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int a[201][401],n,f[201][401][201],m,q,ans=INT_MAX;
     4 int main() {
     5     scanf("%d%d",&n,&q);
     6     scanf("%d",&m);
     7     memset(f,127/3,sizeof(f));
     8     for(int i=1; i<=n; i++)
     9         for(int j=1; j<=i*2-1; j++)
    10             scanf("%d",&a[i][j]);
    11     f[1][1][0]=a[1][1];
    12     f[1][1][1]=0;
    13     for(int i=2; i<=n; i++)
    14         for(int j=1; j<=i*2-1; j++)
    15             for(int k=0; k<=q; k++) {
    16                 f[i][j][k]=min(f[i-1][j][k]+a[i][j],f[i][j][k]);
    17                 f[i][j][k]=min(f[i-1][j-1][k]+a[i][j],f[i][j][k]);
    18                 f[i][j][k]=min(f[i-1][j-2][k]+a[i][j],f[i][j][k]);
    19                 f[i][j][k]=min(f[i-1][j][k-1],f[i][j][k]);
    20                 f[i][j][k]=min(f[i-1][j-1][k-1],f[i][j][k]);
    21                 f[i][j][k]=min(f[i-1][j-2][k-1],f[i][j][k]);
    22             }
    23     for(int i=1; i<=2*n-1; i++)
    24         ans=min(ans,f[n][i][q]);
    25     if(m-ans>0)
    26         printf("%d
    ",m-ans);
    27     else
    28         printf("DEAD
    ");
    29     return 0;
    30 }
  • 相关阅读:
    跳跃游戏
    不同路径
    最大子序和
    最长回文子序列
    最长公共子序列
    零钱兑换
    合并区间
    寻找数组的中心索引
    制造小程序中的一些经验
    h5写的一个签到积分系统
  • 原文地址:https://www.cnblogs.com/sbwll/p/13380969.html
Copyright © 2011-2022 走看看