Problem Description
世界杯結束了,意大利人連本帶利的收回了法國人6年前欠他們的債,捧起了大力神杯,成就了4星意大利.
世界杯雖然結束了,但是這界世界杯給我們還是留下許多值得回憶的東西.比如我們聽到了黃名嘴的3分鐘激情解說,我們懂得了原來可以向同一個人出示3張黃牌,我們還看到了齊達內的頭不僅能頂球還能頂人…………
介于有這么多的精彩,xhd決定重溫德國世界杯,當然只是去各個承辦世界杯比賽的城市走走看看.但是這需要一大比錢,幸運的是xhd對世界杯的熱愛之情打動了德國世界杯組委會,他們將提供xhd在中國杭州和德國任意世界杯承辦城市的往返機票,并說服了這些城市在xhd到達這座城市時為他提供一筆生活費以便他在那里參觀時用,當參觀完時剩余的錢也將留給xhd,但當生活費不夠時他們將強行結束xhd的這次德國之行,除了這個,他們還有一個條件,xhd只能根據他們所給的路線參觀.比如有3座城市a,b,c,他們給定了a-b-c-a的路線,那么xhd只有3種參觀順序abc,bca,cab.由于各個城市所提供的生活費和在那里的花費都不同,這使xhd很頭痛,還好我們事先知道了這筆生活費和花費.請問xhd最多能順利參觀幾座城市?
Input
每組輸入數據分兩行,第一行是一個正整數n(1<=n<=100000),表示有n座城市.接下來的一行按照給定的路線順序的輸出這n個城市的生活費和花費,w1,l1,w2,l2,……,wn,ln,其中wi,li分別表示第i個城市的生活費和花費,并且它們都是正整數.
Output
對應每組數據輸出最多能參觀的城市數.
Sample Input
3
3 2 3 4 2 2
3
3 2 3 4 2 3
Sample Output

/**//*狀態方程:F[I]=MAX(F[I-1]+A[I],A[I])*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100000
int dp[MAX];
int sum[MAX];
int a[2*MAX];
int max(int a,int b)


{
return a>b? a:b;
}
int main()


{
int i,a1,a2,n;
while(scanf("%d",&n)!=EOF)

{
memset(dp,0,sizeof(dp));
int num;
for(i=0;i<n;i++)

{
scanf("%d%d",&a1,&a2);
a[i]=a[i+n]=a1-a2;
}
if(a[0]>=0)
dp[0]=1;
sum[0]=a[0];
num=dp[0];
for(i=1;i<2*n;i++)

{
if(num==n)
break;
if(a[i]>=0)

{
if(sum[i-1]>=0)

{
dp[i]=dp[i-1]+1;
//if(num<=dp[i])
// num=dp[i];
num=max(dp[i],num);
sum[i]=sum[i-1]+a[i];
}
else

{
sum[i]=a[i];
dp[i]=1;
}
}
else

{
if(sum[i-1]+a[i]>=0)

{
dp[i]=dp[i-1]+1;
//if(num<=dp[i])
// num=dp[i];
num=max(dp[i],num);
sum[i]=sum[i-1]+a[i];
}
else

{
dp[i]=0;
sum[i]=a[i];
}
}
}
printf("%d\n",num);
}
}

本題目可以用DP做也可以不用,dp的話是為最長公共子序列,記得是循環就行。
posted on 2013-03-18 09:45
天YU地___PS,代碼人生 閱讀(127)
評論(0) 編輯 收藏 所屬分類:
acm