6.数字三角形

先来解释一下什么是线性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 }

 

posted @ 2020-07-03 09:51  kyk333  阅读(230)  评论(0)    收藏  举报