数字三角形 dp

P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles

题目描述

观察下面的数字金字塔。

写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

        7 
      3   8 
    8   1   0 
  2   7   4   4 
4   5   2   6   5 

在上面的样例中,从 7 \to 3 \to 8 \to 7 \to 573875 的路径产生了最大

输入格式

第一个行一个正整数 rr ,表示行的数目。

后面每行为这个数字金字塔特定行包含的整数。

输出格式

单独的一行,包含那个可能得到的最大的和。

输入输出样例

输入 #1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5 
输出 #1
30

说明/提示

【数据范围】
对于 100\%100% 的数据,1\le r \le 10001r1000,所有输入在 [0,100][0,100] 范围内。

题目翻译来自NOCOW。

USACO Training Section 1.5

IOI1994 Day1T1

 

从底部开始每一个数往上加,因为每一步都是最优的,所以最顶上的那个数就是答案

 

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long int ll;
const ll N = 4e6 + 10;
const ll INF =0x7fffffff;
ll  k[N],p[1005][1005];
//char str[1005][1005];
int book[1005][1005];
int dxy[][2] = { {-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1} };string s[10000];
ll dp[1005][1005];
char str[1005][1005];
int a,b,c,d;
ll gcd(ll a,ll b) {
    return b==0?a:gcd(b,a%b);
}
void solve() {
    ll n;
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            cin>>p[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        dp[n][i]=p[n][i];
    }
    for(int i=n-1;i>=1;i--){
        for(int j=1;j<=i;j++){
            dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+p[i][j];
        }
    }
    cout<<dp[1][1]<<endl;
}
int main() {
//    ll t;
//    scanf("%lld",&t);
//    while(t--)
    solve();
    return 0;
}

 

posted @ 2022-04-18 19:34  ToBe-possible  阅读(42)  评论(0编辑  收藏  举报