zoukankan      html  css  js  c++  java
  • 蒜头君的坐骑

    蒜头君的坐骑

    题目大意

    蒜头君有一只坐骑,人马。

    一天,蒜头君骑着他的坐骑走上了一片 n imes mn×m 的大荒野,一开始时,蒜头君在 (1,1)(1,1) 点,他要前往 (n,m)(n,m) 点,蒜头君的人马每次可以向右或向下移动一格。然而这片荒野并不平静,除了起点和终点外每个点都有一只怪物会袭击蒜头君。

    然而蒜头君的人马强大无比,它会先对怪物造成等同于它攻击力的伤害,然后蒜头君才会受到怪物的攻击,伤害等同于怪物的攻击力。然后人马再攻击怪物,怪物再攻击蒜头君,直至怪物死去,假设每个怪物具有相同的体力。

    此外,蒜头君的人马还有一个强大无比的技能,使用该技能会使蒜头君接下来 kk 次移动,每一次移动后增加等同于移动到的格子的怪物的攻击力,kk 次移动后,人马攻击力恢复至初始攻击力。人马必须在当前一个技能释放完后才可以释放下一个技能,且一共可释放技能的次数有限,那么试问蒜头君从起点到终点最少受到多少点伤害。

    注意:蒜头君的体力是无限的。

    输入格式

    第一行六个正整数 n,m,t,k,h,atkn,m,t,k,h,atk,表示地图长度、宽度、人马技能可使用次数、人马技能持续移动次数、每只怪物的体力和人马的初始攻击力。保证 n+m-1 ge t imes kn+m1t×k。

    接下来 nn 行,每行 mm 个整数,表示每个点的怪物的攻击力。保证 (1,1)(1,1) 点、(n,m)(n,m) 点为 00,其他点为正整数。

    输出格式

    输出一个整数,表示蒜头君受到的最小伤害。

    数据规模

    对于 3030% 的测试数据,满足 1 le n,m le 10,1n,m101 le t le 3,1t31 le k le 31k3;

    对于 6060% 的测试数据,满足 1 le n,m le 100,1n,m1001 le t le 10,1t101 le k le 51k5;

    对于 100100% 的测试数据,满足 1 le n,m le 500,1n,m5001 le t le 10,1t101 le k le 5,1k51 le atk le h le 100,1atkh1001 le1≤ 怪物攻击力 le 100100。

    样例输入

    4 3 2 1 7 4
    0 2 4
    3 5 1
    2 3 2
    5 4 0

    样例输出

    3
     
    题解:
    表示一开始被题目给坑了,因为没有看到开了技能后攻击力是不断叠加的,结果嘛,呵呵~,WA到飞起。
    DP+dfs,其实想到了还是很简单的,一开始没什么头绪。看了看数据范围,发现1k5,这样设计显然是有用意的,因为这么小的数据说明这一部分可以状压或者是dfs,当然这里是dfs。
    有了思路,接下来就很简单了,f[i][j][k]表示到了第i行第j列用了k次技能的最小代价,这里由于只要用了技能,技能效果必然会持续到底,所以只需要对技能放完后的最后一个点进行修改就可以了。(注意这道题不能开long long,不然TLE到飞起)
    AC代码如下:
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int n,m,t,l,h,atk,map[501][501],ans=2e9,f[501][501][11];
    int gi()
    {
        int ans=0,f=1;
        char i=getchar();
        while(i<'0'||i>'9'){if(i=='-')f=-1;i=getchar();}
        while(i>='0'&&i<='9'){ans=ans*10+i-'0';i=getchar();}
        return ans*f;
    }
    int suan(int hurt,int attack)
    {
        return (h-1)/hurt*attack;
    }
    void dfs(int x,int y,int num,int k,int p,int attack)
    {
        if(num>l||(x==n&&y==m))
        {
            f[x][y][k]=min(f[x][y][k],p);
            return;
        }
        if(x+1<=n)dfs(x+1,y,num+1,k,p+suan(attack+map[x+1][y],map[x+1][y]),attack+map[x+1][y]);
        if(y+1<=m)dfs(x,y+1,num+1,k,p+suan(attack+map[x][y+1],map[x][y+1]),attack+map[x][y+1]);
    }
    int main()
    {
        int i,j,k;
        n=gi();m=gi();t=gi();l=gi();h=gi();atk=gi();
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            map[i][j]=gi();
        }
        memset(f,127/3,sizeof(f));
        f[1][1][t]=0;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                for(k=t;k>=0;k--)
                {
                    if(k)dfs(i,j,1,k-1,f[i][j][k],atk);
                    if(i+1<=n)f[i+1][j][k]=min(f[i+1][j][k],f[i][j][k]+suan(atk,map[i+1][j]));
                    if(j+1<=m)f[i][j+1][k]=min(f[i][j+1][k],f[i][j][k]+suan(atk,map[i][j+1]));
                }
            }
        }
        for(i=0;i<=t;i++)
        ans=min(ans,f[n][m][i]);
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    screen:多重视窗管理程序
    tcpdump、nc网络工具使用
    Linux下查看系统版本号信息的方法
    python列表模拟堆栈和队列
    Linux Service and Security
    day2 列表
    Python常用方法
    Nginx1.6.0+MySQL5.6.19+PHP5.5.14(centos)
    LINUX Mysql5.6.19 安装
    python+django+pycharm 环境配置 (window7)
  • 原文地址:https://www.cnblogs.com/huangdalaofighting/p/7263829.html
Copyright © 2011-2022 走看看