zoukankan      html  css  js  c++  java
  • hihocoder1037 数字三角形

    数字三角形是一个典型的DP问题。

    下面是分别采用记忆化bfs和DP的代码:

    采用记忆化bfs:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <queue>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 #define MAXN 201
     8 
     9 int prize[MAXN][MAXN];
    10 int res[MAXN][MAXN];
    11 bool isInQ[MAXN][MAXN];
    12 int n, ans;
    13 
    14 struct node
    15 {
    16     int i, j;
    17     node(int _i, int _j):i(_i),j(_j){}
    18 };
    19 
    20 void bfs()
    21 {
    22     queue<node> q;
    23     q.push(node(1, 1));
    24     memset(isInQ, 0, sizeof(isInQ));
    25     isInQ[1][1] = 1;
    26     while(!q.empty())
    27     {
    28         node nd = q.front();
    29         q.pop();
    30         if(nd.i==1&&nd.j==1)
    31         {
    32             res[1][1] = prize[1][1];
    33         }
    34         else
    35         {
    36             res[nd.i][nd.j] = max(res[nd.i-1][nd.j-1], res[nd.i-1][nd.j])+prize[nd.i][nd.j];
    37         }
    38         if(nd.i<n)
    39         {
    40             if(!isInQ[nd.i+1][nd.j]) q.push(node(nd.i+1, nd.j));
    41             if(!isInQ[nd.i+1][nd.j+1]) q.push(node(nd.i+1, nd.j+1));
    42             isInQ[nd.i+1][nd.j] = isInQ[nd.i+1][nd.j+1] = 1;
    43         }
    44     }
    45     ans = 0;
    46     for(int i=1; i<=n; ++i) ans = max(ans, res[n][i]);
    47 }
    48 
    49 int main()
    50 {
    51     while(scanf("%d", &n)!=EOF)
    52     {
    53         for(int i=1; i<=n; ++i)
    54             for(int j=1; j<=i; ++j)
    55                 scanf("%d", &prize[i][j]);
    56         bfs();
    57         printf("%d
    ", ans); 
    58     }
    59     return 0;
    60 }

    采用DP:

     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 #define MAXN 201
     6 
     7 int prize[MAXN][MAXN];
     8 int dp[MAXN][MAXN];
     9 
    10 int main()
    11 {
    12     int n, ans;
    13     while(scanf("%d", &n)!=EOF)
    14     {
    15         for(int i=1; i<=n; ++i)
    16             for(int j=1; j<=i; ++j)
    17                 scanf("%d", &prize[i][j]);
    18         dp[1][1] = prize[1][1];
    19         for(int i=1; i<=n; ++i) dp[i][0] = 0;
    20         for(int i=2; i<=n; ++i)
    21         {
    22             for(int j=1; j<=i; ++j)
    23                 dp[i][j] = max(dp[i-1][j-1], dp[i-1][j])+prize[i][j];
    24         }
    25         ans = 0;
    26         for(int i=1; i<=n; ++i) ans = max(ans, dp[n][i]);
    27         printf("%d
    ", ans);
    28     }
    29     return 0;
    30 }

    题目来源:http://hihocoder.com/problemset/problem/1037

  • 相关阅读:
    MongoDB 数据类型
    linux 查看网卡流量:nload
    Linux 抓包工具:tcpdump
    python 合并列表 从大到小排序
    MongoDB的客户端管理工具--nosqlbooster 连接MongoDB服务器
    MongoDB 用户管理
    MongoDB 数据库操作
    MongoDB与关系型数据库 区别
    MongoDB 新建数据库和集合 查询集合
    POJ 1491
  • 原文地址:https://www.cnblogs.com/pczhou/p/4295264.html
Copyright © 2011-2022 走看看