zoukankan      html  css  js  c++  java
  • 洛谷P1216 数字三角形【dp】

    题目https://www.luogu.org/problemnew/show/P1216

    题意:

    给定一个三角形。从顶走到底,问路径上的数字之和最大是多少。

    走的时候可以往左下(实际上纵坐标不变)或是往右下(纵坐标+1)

    思路:

    用$dp[i][j]$表示从$(1,1)$走到$(i,j)$的最大值。

    $(i,j)$可以从$(i-1,j)$或是$(i-1,j-1)$走过来

    所以$dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + num[i][j]$

    初态为$dp[1][1] = num[1][1]$,最后遍历一次第$n$行的$dp$值

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<map>
     4 #include<set>
     5 #include<iostream>
     6 #include<cstring>
     7 #include<algorithm>
     8 #include<vector>
     9 #include<cmath> 
    10 #include<queue>
    11 
    12 #define inf 0x7f7f7f7f
    13 using namespace std;
    14 typedef long long LL;
    15 typedef pair<int, int> pr;
    16 
    17 const int maxn = 1005;
    18 int n;
    19 int tri[maxn][maxn];
    20 int dp[maxn][maxn];
    21  
    22 int main()
    23 {
    24     scanf("%d", &n);
    25     for(int i = 1; i <= n; i++){
    26         for(int j = 1; j <= i; j++){
    27             scanf("%d", &tri[i][j]);
    28         }
    29     }
    30     dp[1][1] = tri[1][1];
    31     for(int i = 2; i <= n; i++){
    32         for(int j = 1; j <= i; j++){
    33             dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + tri[i][j];
    34         }
    35     }
    36     
    37     int ans = 0;
    38     for(int i = 1; i <= n; i++){
    39         ans = max(ans, dp[n][i]);
    40     }
    41     printf("%d
    ", ans);
    42     return 0;
    43 }
  • 相关阅读:
    vs2005 enable your debug
    暑假的安排
    session
    我所看过的电影——不断更新中……
    symbian
    CUDA学习。。。visual assist 扩展
    MySQL密码修改
    fcitx in Fedora
    LDAP身份验证
    mysql自增auto_increment删除记录
  • 原文地址:https://www.cnblogs.com/wyboooo/p/10384997.html
Copyright © 2011-2022 走看看