• ZOJ 3623 Battle Ships 简单DP


    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3623

    题意:给出N种可以建造的船和对方的塔生命值L,每种船给出建造时间t[i]和每秒输出dps[i],船坞在同一时间仅仅能建造一支船(类似红警),问多少时间以后可以灭掉塔。

    思路:dp[i]代表的是在前i秒内能造成的伤害量,把时间反过来考虑,对于每支船的建造,在前i秒内所占用的建造时间是第i-t[i]+1~i秒,状态转移方程是dp[i+t[j]]=max(dp[i+t[j]],dp[i]+dps[j]*i),因为建设船的时间是第i~t[i]+1~i秒,所以在状态转移时不会出现建设时间的重叠情况。

    P.S.比赛的时候不机智了,题意里的each time被我理解成了每秒能够选择造一艘新的船。

    代码:

    #include <algorithm>
    #include <cmath>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <ctime>
    #include <ctype.h>
    #include <iostream>
    #include <map>
    #include <queue>
    #include <set>
    #include <stack>
    #include <string>
    #include <vector>
    #define eps 1e-8
    #define INF 0x7fffffff
    #define maxn 10005
    #define PI acos(-1.0)
    #define seed 31//131,1313
    typedef long long LL;
    typedef unsigned long long ULL;
    using namespace std;
    int t[35],dps[35];
    int dp[355];
    int main()
    {
        int N,L;
        while(~scanf("%d%d",&N,&L))
        {
            memset(dp,0,sizeof(dp));
            for(int i=0;i<N;i++)
                scanf("%d%d",&t[i],&dps[i]);
            for(int i=0;i<=L+20;i++)
                for(int j=0;j<N;j++)
                    dp[i+t[j]]=max(dp[i+t[j]],dp[i]+dps[j]*i);
            for(int i=0;i<=L+20;i++)
                if(dp[i]>=L)
                {
                    printf("%d
    ",i);
                    break;
                }
        }
        return 0;
    }

  • 相关阅读:
    全局变量和局部变量
    单例模式i
    高阶函数
    闭包和内存管理
    用python 写网络爬虫--零基础
    robots.txt 文件是什么? 如何获取
    Python: NLTK几个入门函数
    nltk book的下载
    nltk 环境安装( WINDOWS 7 32位 环境下)
    遇到问题
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4470692.html
Copyright © 2020-2023  润新知