牛客网【每日一题】7月29日题目精讲—Max Power
來源:牛客網:
Max Power
時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld題目描述
小鹵蛋剛把dnf的技能點重新洗了一遍,現在他要重新加點,假設他的技能樹一共有n層,第i層有n-i+1個
技能,每個技能只能夠學習一次。除了第1層的技能可以直接學習外,其他技能學習都要學習前置技能,
即你要學習第i(i>=2)層第j列的技能,那么你要先學習第i-1層的第j列和第j+1列的技能。每個技能學習 后都會獲得一定的戰(zhàn)力加成。
現在小鹵蛋有m個技能點,一個技能點可以學習一個技能,他想知道加完點后他可以獲得的最大戰(zhàn)力加成為多少。
輸入描述:
有多組樣例輸入,輸入到文件結束.
每組樣例第一行輸入2個整數n(1<=n<=50)和m(1<=m<=1300),對應題目上的含義。
接下來共有n行,第i行有n-i+1個數,代表這個技能學習后獲得的戰(zhàn)力加成(戰(zhàn)力加成<=1000)。
輸出描述:
輸出最大的戰(zhàn)力加成。
示例1
輸入
復制
輸出
復制
題解:
我們可以看出這是個倒三角的形狀。要學技能x,就要學習它上面的兩個技能,這兩個技能上面的三個技能,一直推到第一層,這就是一個倒三角形狀,也就是倒三角的內容我沒必須全部學習。
我們從列的方向看,會發(fā)現每一列所學的技能是一個從上往下的一個連續(xù)區(qū)間,(中間若有斷開則最底下的技能將無法學習)。其次,左一列總比右一列多學一個(如下)
所以我們就從右向左一列一列的轉移
dp[i][j][k]表示前i列一共選了k個技能學習,第i列選了連續(xù)的前j個
dp[i][j][k]=max(dp[i-1][p][k-j]+sum[i][j])
保證倒三角內技能全部學習
其中:
sum[i][j]是列的前綴和,表示第i列前j個數字的和
p>=j-1,從j-1枚舉到n-i+1枚舉,
即第i-1列最少只比第i列少選一個(最多則可以選完)。
最后每個位置的dp[i][j][m]最大值為答案
代碼:
#include<bits/stdc++.h> using namespace std; const int maxn=55; int sum[maxn][maxn]; int dp[maxn][maxn][1308]; int a[maxn]; int main() {int n,m;while(cin>>n>>m){for(int i=1;i<=n;i++){a[i]=a[i-1]+i;for(int j=1;j<=n-i+1;j++){int x;cin>>x;sum[i][j]=x+sum[i-1][j];}}memset(dp,0,sizeof(dp));int sun=0;for(int i=n;i;i--){for(int j=0;j<=n-i+1;j++){for(int k=a[j];k<=m;k++){for(int p=max(j-1,0);p<n-i+1;p++){dp[i][j][k] = max(dp[i][j][k], dp[i + 1][p][k - j] + sum[j][i]);}sun = max(sun, dp[i][j][m]);}}}cout<<sun<<endl;} }總結
以上是生活随笔為你收集整理的牛客网【每日一题】7月29日题目精讲—Max Power的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 长期喝碧生源常润茶怎么样
- 下一篇: 牛客网【每日一题】7月30日题目精讲—X