題目描述
給定n個整數組成的序列,現在要求將序列分割為m段,每段子序列中的數在原序列中連續排列。 如何分割才能使這m段子序列的和的最大值達到最小?
解題思路
用dp[i][j]儲存長度為i,分j段後其子序列和的最大值的最小值,那麼它由兩部分構成:
當j=1時,dp[i][1]表示的是長為i的整個序列的和;
當j>1時,dp[i][j] = min(for(k=1; k<=i; k++)max(dp[k][j-1], dp[i][1] - dp[k][1]));
具體**實現
#include #include#define max_value 32767
int dp[100][100] ; //dp[i][j]儲存0~i的j個分組的和的最大值的最小值
int max(int n1,int n2)
void calculate(int a,int n,int m)
for(int i=1;i<=n;i++)
}dp[i][j]=min;
} }printf("%d",dp[n][m]);
}void dp_test_printf(int n,int m)
printf("\n"); }}
int main()
calculate(a,n,m);
// dp_test_printf(n,m);
return 0;
}
最小m子段和(動態規劃)
問題描述 給定n個整數組成的序列,現在要求將序列分割為m段,每段子序列中的數在原序列中連續排列。如何分割才能使這m段子序列的和的最大值達到最小?輸入格式 第一行給出n,m,表示有n個數分成m段,隨後一行給出n個數,以空格分隔 輸入樣例 9 39 8 7 6 5 4 3 2 1 輸出樣例 解釋 9 8...
動態規劃 最大m子段和
繼最大子段和在空間上的推廣,那麼再來看看她在個數上的延伸。最大子段和就是最大m子段和問題在m 1時的特殊情況 類似最大欄位和中的b j 這裡假設b i,j 表示陣列a的前j項中i個子段和的最大值,且第i個子段含a j 其中b i,j 1 a j 表示第i個子段含a j 而 初始時b 0,j 0,0 ...
動態規劃 最大m子段和
在最大m子段和問題中,要求取m個互不相交子段,和為最大值。最大m子段和問題是最大子段和在子段個數上的推廣,最大子段和問題是m 1的特殊情況。在這個問題中,我們使用乙個矩陣b i j 他表示的意義是在前 j 項中被分為 i 段的最大 i 子段和。首先,既然是前 j 項需要分為 i 段,所以當 i j ...