題目的規模n最大有1e4,所以直接暴力列舉起點終點,再進行求和複雜度o(n^3),會超時;因為是連續區間,容易想到用字首和優化一下,可以去掉直接暴力的最內層求和,即換成sum[j]-sum[i],複雜度o(n^2),但還是會超時。下面給出3個可行的解法。
解法1:仍然採用字首和的思想,只不過再優化一下。對於固定的j,要想sum[j]-sum[i]最大,即求得以j結尾的最大連續和,只要sum[i]最小即可。那麼我們只需要在列舉j的時候維護一下[0,j-1]範圍內的最小的sum[i]就行了,然後在這期間維護一下ans就行了。複雜度o(n)。
#include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define for(i,k,n) for(int i=k;i=0) flag=1;
}if(!flag) printf("0 %d %d\n",a[0],a[n-1]);
else
}printf("%d %d %d\n",ans,a[l],a[r]);}}
return 0;
}
解法2:dp。記dp[i]為以i結尾的最大連續和,那麼dp[i]=max(dp[i-1]+a[i],a[i])。在實現的時候可以不用陣列,因為當dp[i-1]<0時,dp[i]=a[i];當dp[i-1]>=0時,dp[i]=dp[i-1]+a[i](因為l和r取第乙個滿足要求的,所以當dp[i-1]==0時應取這個等式),所以用乙個變數來維護dp[i-1]即可,在下面的**中這個變數為cur。複雜度o(n)。
#include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define for(i,k,n) for(int i=k;i=0) flag=1;
}if(!flag) printf("0 %d %d\n",a[0],a[n-1]);
else
return s1+s2;
}int main()
if(!flag) printf("0 %d %d\n",a[0],a[n-1]);
else
}return 0;
}
HDU 1231 最大連續子串行和
給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和 為20。在今年的資料結構考卷中,要求編寫程式得到最大和,現在增加乙個要求,即還需要輸出該 子串行的第乙個和最後乙個元素。input 測試輸入...
HDU1231 最大連續子串行和
problem description 給定k個整數的序列,其隨意連續子串行可表示為,當中 1 i j k。最大連續子串行是全部連續子串行中元素和最大的乙個,比如給定序列,其最大連續子串行為。最大和 為20。在今年的資料結構考卷中,要求編敲 得到最大和。如今新增乙個要求,即還須要輸出該 子串行的第乙...
hdu 1231 最大連續子串行
狀態方程dp i max dp i 1 a i a i dp 0 a 0 include include include include include include include include include include include include include includeus...