水題 第五站 HDU Max Sum Plus Plus
阿新 • • 發佈:2018-12-04
畢竟自己還是菜得不行,這個題目是從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;
}
坦白說,知道了思路這個程式碼我也寫不出來,我現在只能大概理解這麼寫的用意,程式碼出處參考部落格