當(dāng)前位置:
首頁(yè) >
帮助同学DP
發(fā)布時(shí)間:2025/4/5
43
豆豆
簡(jiǎn)單DP題
Problem Description
Yukina非常樂(lè)于助人,他每天都會(huì)抽出時(shí)間幫助一些同學(xué)解決代碼問(wèn)題,因?yàn)閅ukina很古板,講究"先來(lái)后到"的原則,所以Yukina不會(huì)先幫助后來(lái)找他的同學(xué)。
如今有n個(gè)同學(xué)需要他的幫助,盡管他非常想一天之類幫助全部人,但畢竟精力有限,于是他決定分m天來(lái)幫助他們。
依據(jù)事情的重要性,Yukina幫助不同同學(xué)會(huì)有不同的能力值。而Yukina獲得的總的能力值為每天獲得的能力值的乘積。
現(xiàn)在給出n和m,以及幫助完各同學(xué)時(shí)獲得的能力值,求Yukina能獲得的最大能力值。
Input
輸入第一行兩個(gè)整數(shù)n,m(1 <= m <= min(n,20); 1 <= n <= 20)
第二行為n個(gè)整數(shù),表示幫助這個(gè)同學(xué)的獲得的能力值,每一個(gè)快樂(lè)值不大于5
Output
輸出Yukina能獲得的最大能力值
Sample Input:
4 2 5 3 3 5Sample Output:
64
分析
狀態(tài)表示:dp[i][j]表示i個(gè)人分成j天幫助所獲得的能力值
狀態(tài)轉(zhuǎn)移
把k個(gè)人分成j-1天完成幫助,剩下的人在另一天完成幫助,取兩者的最大值。
三層循環(huán)
for(int i=1;i<=n;i++)//表示人數(shù)for(int j=1;j<=m;j++){//分成j天幫助for(int k=j-1;k<i;k++){//表示分成k個(gè)人和剩下的人,//最少是j-1個(gè)人,因?yàn)榉殖蒵-1天幫助代碼
#include<iostream> #include<map> #include<string> #include<cstdlib> #include<string.h> using namespace std;map<string,int> mp; string s; int m,n,a[30],sum[30]; long long dp[30][30];//dp[i][j]表示i個(gè)人分成j天幫助獲得的能力值 int main(){cin>>n>>m;sum[0]=0;for(int i=1;i<=n;i++){cin>>a[i];sum[i]=sum[i-1]+a[i]; }memset(dp,0,sizeof(dp));for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)dp[i][j]=1; //cout<<dp[i][j]<<" ";for(int i=1;i<=n;i++)//表示人數(shù)for(int j=1;j<=m;j++){//分成j天幫助for(int k=j-1;k<i;k++){//表示分成k個(gè)人和剩下的人 dp[i][j]=max(dp[i][j],dp[k][j-1]*(sum[i]-sum[k]));} } cout<<dp[n][m];return 0; }總結(jié)