开始研究DP了,这也是研究DP后第一道自己A出来的题目,心情是兴奋+激动+感动啊~~
刚看到题目的时候就联想到了最大连续子序列,只不过这题是由两个子序列构成,一样也是求两个最大连续子序列,思考了一会....不能像别的资料上说直接就想出状态方程...我可是想了好一会的...
思路就是把利用两个数组分别存前N个的最大连续子序列maxnum1[]和后N个的最大连续子序列maxnum2[],把第一个数组的前N个最大和加上第二个数组的后N个最大和就是一个新的数组按时ans[],而在这个新的数组里面找出最大值就是题目要求的两个序列的最大和了。好吧我承认我的ans[]白用了,直接可以找出最大值不用用ans[]保存。
以下是代码:
#include<stdio.h> int main() { int T,n,i,num[60000],maxnum1[60000],maxnum2[60000],dp[60000],max,dp2[60000],ans[60000]; scanf("%d",&T); while(T--) { max=-100000; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&num[i]); dp[0]=num[0]; dp2[n-1]=num[n-1]; maxnum2[n-1]=num[n-1]; maxnum1[0]=num[0]; for(i=1;i<n;i++) { if(dp[i-1]>0) dp[i]=dp[i-1]+num[i]; else dp[i]=num[i]; if(dp2[n-i]>0) dp2[n-i-1]=dp2[n-i]+num[n-i-1]; else dp2[n-i-1]=num[n-i-1]; if(dp[i]>maxnum1[i-1]) maxnum1[i]=dp[i]; else maxnum1[i]=maxnum1[i-1]; if(dp2[n-i-1]>maxnum2[n-i]) maxnum2[n-i-1]=dp2[n-i-1]; else maxnum2[n-i-1]=maxnum2[n-i]; } for(i=0;i<n-1;i++) { ans[i]=maxnum1[i]+maxnum2[i+1]; if(ans[i]>max) max=ans[i]; } printf("%d\n",max); } }