HDU1422 重温世界杯【DP】

题目链接:

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
#include
#include
#include
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;
}


你可能感兴趣的:(就是DP,-----,动态规划,-----)