C 加点
思路
动态规划(dp)
- 令a[i][j]为第i项属性加j点时获得的战力
- 令b[i][j]为前i项属性总共加j点时最多能获得的战力
- 状态转移方程为 b[i][j]=max(a[i][0]+b[i-1][j], a[i][1]+b[i-1][j-1],……,a[i][j]+b[i-1][0])
- 理解后可以尝试将a数组和b数组合并为一个数组
对题意理解有问题的可以看题目中的提示。
ac代码:
#include <iostream>
#include<fstream>
#include<string>
using namespace std;
typedef long long ll;
ll a[109][109];
ll b[109][109];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
{
cin >> a[i][j];
b[i][j] = a[i][j];
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
for (int k = 0; k <= j; ++k)
{
b[i][j] = max(b[i][j], a[i][j - k] + b[i - 1][k]);
}
cout << b[n][m] << endl;
}