http://acm.hdu.edu.cn/showproblem.php?pid=1422
1.这里的循环数组还可以通过把n数组复制一倍数实现
2.关键在于要想到不回溯这部分的代码,
每次sum不够时,不是从头开始,而是左端往右收缩。我当时以为收缩的后得到的新结果未必能
够保证未收缩的中间部分能够到达。但是仔细想,如果收缩的部分整体必然是拖累的部分,去掉这部分,中间部分只会更好。
这就是while的寻溯的神奇之处。
3.可是能够写状态方程吗?
#include<stdio.h>
int main (){
int m , n , g , c , i , j , max , sum , count , a [ 100001 ];
while( scanf ( "%d" ,& n )!=- 1 ){
for( i = 0 ; i < n ; i ++){
scanf ( "%d%d" ,& g ,& c );
a [ i ]= g - c ;
}
sum = 0 ; max = 0 ;
j = count = 0 ;
m = n ;
for( i = 0 ; i < m ; i ++){
sum += a [ i ];
while( sum < 0 ){// 如果sum<0,不回溯,而是sum-=a[i]。这一点体现了动态规划思想
count --;
sum -= a [ j ++];
}
if( j >= n )
break;
count ++;
if( max < count )
max = count ;
if( count == n ){
max = n ;
break;
}
if( i == n - 1 ){
i =- 1 ;
m = j ;
}
}
printf ( "%d\n" , max );
}
return 0 ;
}