最大m子段和

 

最大m子段和

定义一串子段s1,s2,s3 ... sn-1,sn

求m段不交叉最大子段和

解:
设dp[i][j]代表前j个数分成i段的最大和(包括a[j])

状态转移方程:

dp[i][j]=Max(dp[i][j-1]+a[j],dp[i-1][t]+a[j]) (i-1=<t<j)

解释两种状态的最优解:
①.a[j]恰好在下一次最优解末项之后,将a[j]融入a[j-1]的子段中,总段数i不变,+a[j]
②.a[j]不在最优解末项之后,而是单独成一段,那么下一次递归对象总段数-1(i-1),末项为
k,i-1=<t<j,k如果小于i-1负溢出。+a[j]

 

 

 

 1 #include<cstdio>
 2 using namespace std;
 3 int main()
 4 {
 5     int n, num, cnt, ans;
 6     while(scanf("%d", &n)!=EOF)
 7     {
 8         cnt = 0;
 9         for(int i=0; i<n; i++)
10         {
11             scanf("%d", &num);
12             if(cnt==0)
13             {
14                 ans = num;
15                 cnt++;
16             }
17             else
18             {
19                 if(num==ans)
20                     cnt++;
21                 else
22                     cnt--;
23             }
24         }
25         printf("%d\n", ans);
26     }
27     return 0;
28 }

 

posted @ 2018-10-28 21:26  Rohlf  阅读(230)  评论(0编辑  收藏  举报