码迷,mamicode.com
首页 > 其他好文 > 详细

HDU1422 重温世界杯【DP】

时间:2015-04-25 22:51:07      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1422


题目大意:

给你N个城市,参观路线为1~2~3~4~5~…~N~1。可以从任何一座城市开始参观。每座城市提供的

生活费和需要的花费都不同,问:最多能参观多少个城市。


思路:

因为能形成循环,所以在原有数据的后边再接上1~N的数据。然后用动态规划来做。状态为:当上一

个城市剩下的钱不为负(即还未结束旅游),如果上一个城市剩下的钱加上当前城市的钱大于当前的生活

费,那么dp[i] = dp[i-1] + 1,更新剩下的钱,如果不够旅游了,就将剩下的钱归为0,从当前点开始

旅游,计算最大的dp[i],得到的就是最多能参观的城市数。这里加一个优化,当dp[i] == N(即参观完

N个城市)的时候,跳出循环。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 200010;

int W[MAXN],L[MAXN],dp[MAXN];

int main()
{
    int N,i;
    while(~scanf("%d",&N))
    {
        dp[0] = 0;
        for(i = 1; i <= N; ++i)
        {
			
			scanf("%d %d",&W[i],&L[i]);
			W[i+N] = W[i];
            L[i+N] = L[i];
			dp[i] = dp[N+i] = 0;
		}
		int cost = 0, Max = 0;
        for(i = 1; i <= 2*N; ++i)
        {
            if(cost + W[i] >= L[i])
            {
                dp[i] = dp[i-1] + 1;
                cost = cost + W[i] - L[i];
            }
			else
				cost = 0;
			if(dp[i] > Max)
                Max = dp[i];
            if(dp[i] == N)
                break;
        }
        
        printf("%d\n",Max);
    }

    return 0;
}


HDU1422 重温世界杯【DP】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/45274429

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!