• 1002 数塔取数问题


    基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题

    一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值。
    每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上。
     
       5
      8 4
     3 6 9
    7 2 9 5
     
    例子中的最优方案是:5 + 8 + 6 + 9 = 28
     
    Input
    第1行:N,N为数塔的高度。(2 <= N <= 500)
    第2 - N + 1行:每行包括1层数塔的数字,第2行1个数,第3行2个数......第k+1行k个数。数与数之间用空格分隔(0 <= A[i] <= 10^5) 。
    Output
    输出最大值
    Input示例
    4
    5
    8 4
    3 6 9
    7 2 9 5
    Output示例
    28

    刷了一晚上水题刷得有点膨胀??

    首先初始化最底层,从底向上做dp,则可得dp方程为:dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+map[i][j];

    附AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 int map[510][510];
     5 int dp[501][510];
     6 
     7 int main(){
     8     int t;
     9     cin>>t;
    10     for(int i=0;i<t;i++){
    11         for(int j=0;j<=i;j++){
    12             cin>>map[i][j];
    13         }
    14     }
    15     for(int i=0;i<t;i++){
    16         dp[t-1][i]=map[t-1][i];
    17     }
    18     for(int i=t-1;i>=0;i--){
    19         for(int j=0;j<=i;j++){
    20             dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+map[i][j];
    21         }
    22     }
    23     cout<<dp[0][0]<<endl;
    24     return 0;
    25 }

    当然 这题直接贪心会更快:

     1 #include <stdio.h>
     2 
     3 using namespace std;
     4 
     5 #define MAXNUM 125250
     6 int tower[501][501]={0};
     7 int S[501][501]={0};
     8 int main(int argc,char** argv)
     9 {
    10     int n;scanf("%d",&n);
    11     
    12     for(int i=0;i<n;i++)
    13         for(int j=0;j<=i;j++){
    14             scanf("%d",&tower[i-j][j]);
    15             
    16         }
    17     
    18     int i,j,temp=0;
    19     for(i=0;i<n;i++)
    20         for(j=0;j<n;j++){
    21             
    22             if(i>0)
    23                 temp=S[i-1][j];
    24             if(j>0)
    25                 if(temp<S[i][j-1])
    26                     temp=S[i][j-1];
    27             
    28             S[i][j]=tower[i][j]+temp;
    29             
    30         }
    31         
    32     printf("%d",S[i-1][j-1]);
    33     
    34     return 0;
    35 }
  • 相关阅读:
    PHP用curl发送get post put delete patch请求
    ubuntu中设置php7.0-fpm开机自启动
    对计算机领域中间层的理解
    后端程序猿怎能不会的linux命令
    查看磁盘空间和目录大小的命令
    Http协议详解
    supervisor使用总结
    vmware中扩充磁盘
    HDU 4946 共线凸包
    Codeforces_GYM Flight Boarding Optimization
  • 原文地址:https://www.cnblogs.com/Kiven5197/p/5778011.html
Copyright © 2020-2023  润新知