春希非常愛管閒事,他每天都會抽空幫助一些同學,由於春希非常死板,出於公平性,春希不會先幫助後來找他的同學。
現在有
根據事情的重要性,春希幫助不同同學會有不同的快樂值,而春希獲得的總的快樂值為每天獲得的快樂值的乘積。
現在給出
第一行為一個整數
每組數據,第一行兩個整數
第二行為
每組數據輸出一行,一個整數,表示最大的快樂值。
1 5 3 3 2 1 4 5
125解題思路: dp[j][i]表示前j個數分為i部分的和的乘積的最大值。測試用例中(3+2)*(1+4)*5=125 三重循環。 dp[j][i]=max(dp[j][i],dp[k][i-1]*(sum[j]-sum[k])); 關鍵代碼:
for(int i=1;i<=m;i++)
for(int j=n;j>=i;j--)
for(int k=i-1;k
代碼:
#include
#include
#include
using namespace std;
const int maxn=25;
int dp[maxn][maxn];
int num[maxn],sum[maxn];
int t,n,m;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
dp[i][j]=1;
sum[0]=0;
for(int i=1;i<=n;i++)
{
cin>>num[i];
sum[i]=sum[i-1]+num[i];
}
for(int i=1;i<=m;i++)
for(int j=n;j>=i;j--)
for(int k=i-1;k一開始寫的一維的,可是一直WA,不知道為什麼,求解。
錯誤的一維代碼:
#include
#include
#include
using namespace std;
int sum[25];
int num[25];
int dp[25];
int t;
int n,m;
int main()
{
cin>>t;
while(t--)
{
sum[0]=0;
dp[0]=1;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>num[i];
sum[i]=sum[i-1]+num[i];
dp[i]=1;
}
for(int i=1;i<=m;i++)
{
for(int j=n;j>=i;j--)
{
for(int k=i-1;k