這道題就是尋找最優子結構的問題
一開始我的代碼是這樣的:
#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);所以第二段代碼的運行時間比第一段小一個階級。
這是我的經歷,希望對大家有所幫助。