http://acm.hdu.edu.cn/showproblem.php?pid=2084

题意:

        7
      3      8
    8     1       0
  2       7     4       4
4    5    2       6        5
在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。
路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。
 
解法1:dfs搜索每一条路径,可以发现很多点会重复搜索。时间复杂度为:O(2的n次方)
  1. //#include <bits/stdc++.h>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <iostream>
  7. #include <string>
  8. #include <stdio.h>
  9. #include <queue>
  10. #include <stack>
  11. #include <map>
  12. #include <set>
  13. #include <string.h>
  14. #include<time.h>
  15. #include <vector>
  16. #define ME(x , y) memset(x , y , sizeof(x))
  17. #define SF(n) scanf("%d" , &n)
  18. #define rep(i , n) for(int i = 0 ; i < n ; i ++)
  19. #define INF 0x3f3f3f3f
  20. #define mod 20191117
  21. #define PI acos(-1)
  22. using namespace std;
  23. typedef long long ll ;
  24. int a[109][109];
  25. int n ;
  26.  
  27. int getsum(int i , int j)
  28. {
  29. if(i == n)
  30. return a[i][j];
  31. else{
  32. int x = getsum(i+1 , j);
  33. int y = getsum(i+1 , j+1);
  34. return max(x , y) + a[i][j];
  35. }
  36. }
  37.  
  38. int main()
  39. {
  40. /*#ifdef ONLINE_JUDGE
  41. #else
  42. freopen("D:/c++/in.txt", "r", stdin);
  43. freopen("D:/c++/out.txt", "w", stdout);
  44. #endif*/
  45. int t ;
  46. scanf("%d" , &t);
  47. while(t--)
  48. {
  49. memset(dp , -1 , sizeof(dp));
  50. scanf("%d" , &n);
  51. for(int i = 1 ; i <= n ; i++)
  52. {
  53. for(int j = 1 ; j <= i ; j++)
  54. {
  55. scanf("%d" , &a[i][j]);
  56. }
  57. }
  58. cout << getsum(1 , 1) << endl ;
  59.  
  60. }
  61.  
  62. return 0;
  63. }

解法1改进:记忆化搜索,将搜索过的点记录下来。时间复杂度O(n的平方)。

  1. //#include <bits/stdc++.h>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <iostream>
  7. #include <string>
  8. #include <stdio.h>
  9. #include <queue>
  10. #include <stack>
  11. #include <map>
  12. #include <set>
  13. #include <string.h>
  14. #include<time.h>
  15. #include <vector>
  16. #define ME(x , y) memset(x , y , sizeof(x))
  17. #define SF(n) scanf("%d" , &n)
  18. #define rep(i , n) for(int i = 0 ; i < n ; i ++)
  19. #define INF 0x3f3f3f3f
  20. #define mod 20191117
  21. #define PI acos(-1)
  22. using namespace std;
  23. typedef long long ll ;
  24. int a[109][109];
  25. int n ;
  26. int dp[109][109];
  27.  
  28. int getsum(int i , int j)
  29. {
  30. if(i == n)
  31. return a[i][j];
  32. else{
  33. if(dp[i][j] != -1) return dp[i][j];
  34. int x = getsum(i+1 , j);
  35. int y = getsum(i+1 , j+1);
  36. dp[i][j] = max(x,y)+a[i][j];
  37. return max(x , y) + a[i][j];
  38. }
  39. return dp[i][j] ;
  40. }
  41.  
  42. int main()
  43. {
  44. /*#ifdef ONLINE_JUDGE
  45. #else
  46. freopen("D:/c++/in.txt", "r", stdin);
  47. freopen("D:/c++/out.txt", "w", stdout);
  48. #endif*/
  49. int t ;
  50. scanf("%d" , &t);
  51. while(t--)
  52. {
  53. memset(dp , -1 , sizeof(dp));
  54. scanf("%d" , &n);
  55. for(int i = 1 ; i <= n ; i++)
  56. {
  57. for(int j = 1 ; j <= i ; j++)
  58. {
  59. scanf("%d" , &a[i][j]);
  60. }
  61. }
  62. cout << getsum(1 , 1) << endl ;
  63. }
  64.  
  65. return 0;
  66. }

解法2、递归转为递推。从底层向上递推。

  1. //#include <bits/stdc++.h>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <iostream>
  7. #include <string>
  8. #include <stdio.h>
  9. #include <queue>
  10. #include <stack>
  11. #include <map>
  12. #include <set>
  13. #include <string.h>
  14. #include<time.h>
  15. #include <vector>
  16. #define ME(x , y) memset(x , y , sizeof(x))
  17. #define SF(n) scanf("%d" , &n)
  18. #define rep(i , n) for(int i = 0 ; i < n ; i ++)
  19. #define INF 0x3f3f3f3f
  20. #define mod 20191117
  21. #define PI acos(-1)
  22. using namespace std;
  23. typedef long long ll ;
  24. int a[109][109];
  25. int n ;
  26. int dp[109][109];
  27.  
  28. int main()
  29. {
  30. /*#ifdef ONLINE_JUDGE
  31. #else
  32. freopen("D:/c++/in.txt", "r", stdin);
  33. freopen("D:/c++/out.txt", "w", stdout);
  34. #endif*/
  35. int t ;
  36. scanf("%d" , &t);
  37. while(t--)
  38. {
  39. memset(dp , -1 , sizeof(dp));
  40. scanf("%d" , &n);
  41. for(int i = 1 ; i <= n ; i++)
  42. {
  43. for(int j = 1 ; j <= i ; j++)
  44. {
  45. scanf("%d" , &a[i][j]);
  46. }
  47. }
  48. for(int i = 1 ; i <= n ; i++)
  49. {
  50. dp[n][i] = a[n][i];
  51. }
  52. for(int i = n - 1 ; i >= 1 ; i--)
  53. {
  54. for(int j = 1 ; j <= i ; j++)
  55. {
  56. dp[i][j] = max(dp[i+1][j] , dp[i+1][j+1])+a[i][j];
  57. }
  58. }
  59. cout << dp[1][1] << endl ;
  60. }
  61.  
  62. return 0;
  63. }

解法2优化空间

  1. //#include <bits/stdc++.h>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <iostream>
  7. #include <string>
  8. #include <stdio.h>
  9. #include <queue>
  10. #include <stack>
  11. #include <map>
  12. #include <set>
  13. #include <string.h>
  14. #include<time.h>
  15. #include <vector>
  16. #define ME(x , y) memset(x , y , sizeof(x))
  17. #define SF(n) scanf("%d" , &n)
  18. #define rep(i , n) for(int i = 0 ; i < n ; i ++)
  19. #define INF 0x3f3f3f3f
  20. #define mod 20191117
  21. #define PI acos(-1)
  22. using namespace std;
  23. typedef long long ll ;
  24. int a[109][109];
  25. int n ;
  26. int dp[109];
  27.  
  28. int main()
  29. {
  30. /*#ifdef ONLINE_JUDGE
  31. #else
  32. freopen("D:/c++/in.txt", "r", stdin);
  33. freopen("D:/c++/out.txt", "w", stdout);
  34. #endif*/
  35. int t ;
  36. scanf("%d" , &t);
  37. while(t--)
  38. {
  39. memset(dp , -1 , sizeof(dp));
  40. scanf("%d" , &n);
  41. for(int i = 1 ; i <= n ; i++)
  42. {
  43. for(int j = 1 ; j <= i ; j++)
  44. {
  45. scanf("%d" , &a[i][j]);
  46. }
  47. }
  48. for(int i = 1 ; i <= n ; i++)
  49. {
  50. dp[i] = a[n][i];
  51. }
  52. for(int i = n - 1 ; i >= 1 ; i--)
  53. {
  54. for(int j = 1 ; j <= i ; j++)
  55. {
  56. dp[j] = max(dp[j] , dp[j+1])+a[i][j];
  57. }
  58. }
  59. cout << dp[1] << endl ;
  60. }
  61.  
  62. return 0;
  63. }

dp入门题(数塔)的更多相关文章

  1. 【dp入门题】【跟着14练dp吧...囧】

    A HDU_2048 数塔 dp入门题——数塔问题:求路径的最大和: 状态方程: dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+a[i][j];dp[n][j] = ...

  2. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  3. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  4. (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520

    题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...

  5. 数字三角形/数塔问题(DP入门题)

    有形如下图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的值最大. 样例输入: 5 13 11 8 12 7 26 6 14 15 8 12 7 ...

  6. HDU2084 数塔 (DP入门题)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  7. HDU 2089 不要62【数位DP入门题】

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. Hdu-1565 方格取数(1) (状态压缩dp入门题

    方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  9. hdu_Anniversary party_(树形DP入门题)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...

随机推荐

  1. StreamWriter、StreamReader

    IO流操作文件内容,using System.IO;//引入命名空间 private void button1_Click(object sender, EventArgs e) { if (text ...

  2. jquery click()方法 语法

    jquery click()方法 语法 作用:当点击元素时,会发生 click 事件.当鼠标指针停留在元素上方,然后按下并松开鼠标左键时,就会发生一次 click.click() 方法触发 click ...

  3. 原生Js_使用setInterval() 方法实现图片轮播功能

    用javascript图片轮播功能 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  4. [CSP-S模拟测试]:集合合并(记忆化搜索)

    题目传送门(内部题133) 输入格式 第一行一个正整数$n$. 第二行$n$个正整数$a_i$,表示一开始有$S_i=\{a_i\}$ 输出格式 输出一个非负整数表示最大的收益之和 样例 样例输入: ...

  5. [CSP-S模拟测试]:线性代数(模拟)

    题目传送门(内部题113) 输入格式 第一行一个正整数$n$. 接下来$n$行,每行$n$个整数,描述$C$矩阵.保证输入的是一个林先森矩阵. 输出格式 若不可能实现,则输出一行$Impossible ...

  6. HTMLHint 配置文件

    HTMLHint 工具可以对 HTML 代码做静态代码检查,从而保证 HTML 代码的规范和质量.HTMLHint 工具内置 23 条规则,建议在 .htmlhintrc 配置文件中将规则尽可能都打开 ...

  7. crossdomain.xml解决跨域问题

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  8. windows+VS+Openjdk12 搭建debug环境

    openjdk12 下载地址: http://jdk.java.net/archive/ https://download.java.net/java/GA/jdk12/33/GPL/openjdk- ...

  9. C# NAudio 录制声音和显示波形图

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  10. Python学习之==>循环

    1.While循环 # 循环的时候是在重复执行循环体里面的东西 # 在循环体里面遇到break,立即结束循环,不管循环有没有完 # 在循环体里面遇到continue,那么就结束本次循环,继续进行下一次 ...