帮助同学DP
簡單DP題
Problem Description
Yukina非常樂于助人,他每天都會抽出時間幫助一些同學(xué)解決代碼問題,因?yàn)閅ukina很古板,講究"先來后到"的原則,所以Yukina不會先幫助后來找他的同學(xué)。
如今有n個同學(xué)需要他的幫助,盡管他非常想一天之類幫助全部人,但畢竟精力有限,于是他決定分m天來幫助他們。
依據(jù)事情的重要性,Yukina幫助不同同學(xué)會有不同的能力值。而Yukina獲得的總的能力值為每天獲得的能力值的乘積。
現(xiàn)在給出n和m,以及幫助完各同學(xué)時獲得的能力值,求Yukina能獲得的最大能力值。
Input
輸入第一行兩個整數(shù)n,m(1 <= m <= min(n,20); 1 <= n <= 20)
第二行為n個整數(shù),表示幫助這個同學(xué)的獲得的能力值,每一個快樂值不大于5
Output
輸出Yukina能獲得的最大能力值
Sample Input:
4 2 5 3 3 5Sample Output:
64
分析
狀態(tài)表示:dp[i][j]表示i個人分成j天幫助所獲得的能力值
狀態(tài)轉(zhuǎn)移
把k個人分成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個人和剩下的人,//最少是j-1個人,因?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個人分成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個人和剩下的人 dp[i][j]=max(dp[i][j],dp[k][j-1]*(sum[i]-sum[k]));} } cout<<dp[n][m];return 0; }總結(jié)
- 上一篇: 面筋哥为什么凉了?
- 下一篇: 什么是核桃肉?怎么清洗?