题意:给一个三角形形状的数字,从上到下,要求数字和最大
思路 :dp
- dp[i+1][j]=max(dp[i+1][j],dp[i][j]+score[i+1][j])
- dp[i+1][j+1]=max(dp[i+1][j],dp[i][j]+score[i+1][j+1]
- 在最后一行进行比较,找到最大值输出
对上面思路的解释:
对于每个位置都是由上面一个位置加当前位置的最大值组成,所以有了上面的递推公式
解决问题的代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 351; int dp[maxn][maxn], score[maxn][maxn]; int main() { int n; scanf("%d", &n); for (int i = 1; i <= n; i++) for (int j = 1; j <= i; j++) scanf("%d", &score[i][j]); dp[1][1] = score[1][1]; for(int i=1;i<=n;i++) for (int j = 1; j <= i; j++) { dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + score[i + 1][j]); dp[i + 1][j + 1] = max(dp[i + 1][j + 1], dp[i][j] + score[i + 1][j + 1]); } int tmp = dp[n][1]; for (int i = 2; i <= n; i++) { if (tmp < dp[n][i]) tmp = dp[n][i]; } printf("%d\n", tmp); return 0; }