标签:class bit img style 题目 图片 大致 分析 mes
先来解释一下什么是线性dp
在求状态转移方程时,有明显的线性求取顺序
比如背包问题
这道题目我们先给数字编号
分析
dp问题的时间复杂度如何分析
一般是状态数量乘以转移的计算量(就是算每个状态需要的计算量)
本题大致就是500 * 500
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 510, INF = 1e9; 4 int a[N][N]; //存储三角形中的每一个点 5 int dp[N][N]; 6 int main() { 7 int n; 8 cin >> n; 9 for (int i = 1; i <= n; i++) { 10 for (int j = 1; j <= i; j++) { 11 cin >> a[i][j]; 12 } 13 } 14 for (int i = 1; i <= n; i++) { //全部初始化为-INF 15 for (int j = 0; j <= i + 1; j++) { //注意每行多初始化一个 16 dp[i][j] = - INF; 17 } 18 } 19 dp[1][1] = a[1][1]; //边界 20 for (int i = 2; i <= n; i++) { //从第2行开始做 21 for (int j = 1; j <= i; j++) { 22 dp[i][j] = max(dp[i - 1][j - 1] + a[i][j], dp[i - 1][j] + a[i][j]); 23 } 24 } 25 int res = -INF; 26 for (int i = 1; i <= n; i++) { //遍历最后一行找最大值 27 res = max(res, dp[n][i]); 28 } 29 cout << res << endl; 30 return 0; 31 }
标签:class bit img style 题目 图片 大致 分析 mes
原文地址:https://www.cnblogs.com/fx1998/p/12833786.html