1. 程式人生 > >水題 第五站 HDU Max Sum Plus Plus

水題 第五站 HDU Max Sum Plus Plus

畢竟自己還是菜得不行,這個題目是從n個數字中選出m個不相交字串,使其和最大,話說這個題目的理解就反覆了好幾次= =,心想這不就是選出m個最大字串,然後和不就是最大嗎?然而還有不相交= =!所以完全沒有思路
網上的思路,動態規劃一個式子幾乎讓我抓狂= =,大神們的抽象思維能力好強= =,看了半天慢慢理出一點兒思路,那麼
(1)對於每個數而言,有三種情況
1.1分到前面的分組
1.2獨立成一組
1.3被拋棄
(2)動態規劃的經典思路dp[i][j]表示j個數分為i組的最大和的值= =,結果就是dp[m][n];
(3)對應前面三種情況列式子dp[i][j]=max(dp[i][j-1]+a[j], max(dp[i-1][k]+a[j]));i-1

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define N 1000000
#define INF 0x7fffffff

int a[N+10];
int dp[N+10],Max[N+10];//max( dp[i-1][k] ) 就是上一組 0....j-1 的最大值。

int main()
{
    int n,m,mmax;
    while (~scanf("%d%d",&m,&n))
    {
        for (int i=1;i<=n;i++)
{ scanf("%d",&a[i]); } memset(dp,0,sizeof(dp)); memset(Max,0,sizeof(Max)); for (int i=1;i<=m;i++)//分成幾組 { mmax=-INF; for (int j=i;j<=n;j++)//j個數分成i組,至少要有i個數 { dp[j]=max(dp[j-1]+a[j],Max[j-1]+a[j]);
Max[j-1]=mmax; mmax=max(mmax,dp[j]); } } printf ("%d\n",mmax); } return 0; }

坦白說,知道了思路這個程式碼我也寫不出來,我現在只能大概理解這麼寫的用意,程式碼出處參考部落格