hdoj1003解法

這道題就是尋找最優子結構的問題

一開始我的代碼是這樣的:

#include<stdio.h>

void main(){
    int arr[100002],num,count,sign=0,i,j,sum,x,y,b;
    scanf("%d",&count);
    while(count--){

    scanf("%d",&num);
    for(i=1;i<=num;i++){
        scanf(" %d",&arr[i]);
    }
    sum=-1001;x=1;y=1;;
    for(i=1;i<=num;i++){
        b=0;
        for(j=i;j<=num;j++){
            b += arr[j];
          if(b>sum) {sum=b;y=j;x=i;}
        }
    }
    printf("Case %d:\n",++sign);
    printf("%d %d %d\n",sum,x,y);
    if(count){
        printf("\n");
    }
    }
}


但是提交後RTO了,所以我就百度了一下,看到一種動態規劃的思想看着挺巧妙的,就參照着更改一下我的代碼。還不錯

(不過最懵逼的是hdoj1002題和1003題都沒明確要求輸出的格式,但兩個的輸出格式卻不相同,真是對輸出格式懵逼)

#include<stdio.h>

void main(){
    int arr[100002],num,count,sign=0,i,head,sum,x,y,b;
    scanf("%d",&count);
    while(count--){

    scanf("%d",&num);
    for(i=1;i<=num;i++){
        scanf(" %d",&arr[i]);
    }
    sum=-1001;x=0;y=0;b=0;head=1;
    for(i=1;i<=num;i++){
        b += arr[i];
        if(b>sum) {sum=b;y=i;x=head;}
        if(b<0){b=0;head = i+1;}
    }
    printf("Case %d:\n",++sign);
    printf("%d %d %d\n",sum,x,y);
    if(count){
        printf("\n");
    }
    }
}

在這裏我比較一下兩段代碼,

第一段的時間複雜度爲O(nlogn),而第二段的時間複雜度爲O(n);所以第二段代碼的運行時間比第一段小一個階級。

這是我的經歷,希望對大家有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章