1422 hdu 世界杯 另类dp

来源:互联网 发布:淘宝女装店铺推荐知乎 编辑:程序博客网 时间:2024/05/13 03:09

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;
}
0 0
原创粉丝点击