描述
在一场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 }