一题基础的动态规划。用dp数组保存各个保龄球所在位置能得到的最高分,再从最后一行得出总的 最大分数。
递推式为
![](https://i-blog.csdnimg.cn/blog_migrate/611389ee15981959eab2a3b292062884.png)
其中bo数组以样本形式存储每个保龄球的分数,dp数组与bo数组位置一一对应
![](https://i-blog.csdnimg.cn/blog_migrate/10c1991be31fd27d66688df1ac8f8492.png)
代码
#include <iostream>
#include<algorithm>
using namespace std;
int N;
const int n = 360;
int bo[n][n],dp[n][n];
void solve()
{
for (int i = 2;i <= N;i++)
{
for (int j = 1;j <= i;j++)
{
if (j == 1)
dp[i][j] = bo[i][j] + dp[i - 1][j];
else if (j == i)
dp[i][j] = bo[i][j] + dp[i - 1][j - 1];
else
dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + bo[i][j];
}
}
}
int main()
{
cin >> N;
for (int i = 1;i <= N;i++)
{
for (int j = 1;j <= i;j++)
cin >> bo[i][j];
}
dp[1][1] = bo[1][1];
solve();
int ans = dp[N][1];
for (int k = 2;k <= N;k++)
ans = dp[N][k] > ans ? dp[N][k] : ans;
cout << ans;
return 0;
}