nyoj-44 字串和 分治+dp+最快解法

来源:互联网 发布:关于养鱼的软件 编辑:程序博客网 时间:2024/05/02 00:01

原题链接》》》


采用算法:分治策略

#include<stdio.h>int num[1000005];int maxsum(int be,int end){    if(end-be==1) return num[be];//只有一个元素,直接返回    int l,L,r,R,i;r=l=0;    int mid=(end+be+1)/2;//分治第一步,划分    int max;L=maxsum(be,mid);R=maxsum(mid,end);//子问题递归求解    max=L>R?L:R;    L=num[mid-1];    for(i=mid-1;i>=be;i--){l+=num[i];if(l>L) L=l;}//分界点向左的最大连续和L    R=num[mid];    for(i=mid;i<end;i++){r+=num[i];if(r>R) R=r;}//分界点向右的最大连续和R    return (max>(L+R)?max:(L+R));//把子问题的解与L+R比较}int main(){    int N,n;    int i;    scanf("%d",&N);    while(N--){        scanf("%d",&n);        for(i=0;i<n;i++) scanf("%d",&num[i]);        printf("%d\n",maxsum(0,n));    }    return 0;} 

dp

#include<stdio.h>#include<string.h>#define Max(a,b) a>b?a:bint num[1000001];int dp[1000001];int main(){    int i,max;    int N;    scanf("%d",&N);    while(N--){        int n;        scanf("%d",&n);        for(i=0;i<n;i++)        scanf("%d",&num[i]);        max=dp[0]=num[0];        for(i=1;i<n;i++){            dp[i]=Max(dp[i-1]+num[i],num[i]);            if(dp[i]>max)            max=dp[i];        }        printf("%d\n",max);    }    return 0;   } 

另一种方法

#include<stdio.h>int num[1000001];int main(){    int i,sum,max;    int N;    scanf("%d",&N);    while(N--){        int n;        scanf("%d",&n);        for(i=0;i<n;i++)        scanf("%d",&num[i]);        sum=0;        max=num[0];        for(i=0;i<n;i++){            if(sum<0)            sum=0;            sum+=num[i];            if(sum>max)            max=sum;        }        printf("%d\n",max);    }    return 0;   } 
0 0