题目链接:

​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;
}