dp入门题(数塔)
http://acm.hdu.edu.cn/showproblem.php?pid=2084
题意:
- //#include <bits/stdc++.h>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- #include <iostream>
- #include <string>
- #include <stdio.h>
- #include <queue>
- #include <stack>
- #include <map>
- #include <set>
- #include <string.h>
- #include<time.h>
- #include <vector>
- #define ME(x , y) memset(x , y , sizeof(x))
- #define SF(n) scanf("%d" , &n)
- #define rep(i , n) for(int i = 0 ; i < n ; i ++)
- #define INF 0x3f3f3f3f
- #define mod 20191117
- #define PI acos(-1)
- using namespace std;
- typedef long long ll ;
- int a[109][109];
- int n ;
- int getsum(int i , int j)
- {
- if(i == n)
- return a[i][j];
- else{
- int x = getsum(i+1 , j);
- int y = getsum(i+1 , j+1);
- return max(x , y) + a[i][j];
- }
- }
- int main()
- {
- /*#ifdef ONLINE_JUDGE
- #else
- freopen("D:/c++/in.txt", "r", stdin);
- freopen("D:/c++/out.txt", "w", stdout);
- #endif*/
- int t ;
- scanf("%d" , &t);
- while(t--)
- {
- memset(dp , -1 , sizeof(dp));
- scanf("%d" , &n);
- for(int i = 1 ; i <= n ; i++)
- {
- for(int j = 1 ; j <= i ; j++)
- {
- scanf("%d" , &a[i][j]);
- }
- }
- cout << getsum(1 , 1) << endl ;
- }
- return 0;
- }
解法1改进:记忆化搜索,将搜索过的点记录下来。时间复杂度O(n的平方)。
- //#include <bits/stdc++.h>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- #include <iostream>
- #include <string>
- #include <stdio.h>
- #include <queue>
- #include <stack>
- #include <map>
- #include <set>
- #include <string.h>
- #include<time.h>
- #include <vector>
- #define ME(x , y) memset(x , y , sizeof(x))
- #define SF(n) scanf("%d" , &n)
- #define rep(i , n) for(int i = 0 ; i < n ; i ++)
- #define INF 0x3f3f3f3f
- #define mod 20191117
- #define PI acos(-1)
- using namespace std;
- typedef long long ll ;
- int a[109][109];
- int n ;
- int dp[109][109];
- int getsum(int i , int j)
- {
- if(i == n)
- return a[i][j];
- else{
- if(dp[i][j] != -1) return dp[i][j];
- int x = getsum(i+1 , j);
- int y = getsum(i+1 , j+1);
- dp[i][j] = max(x,y)+a[i][j];
- return max(x , y) + a[i][j];
- }
- return dp[i][j] ;
- }
- int main()
- {
- /*#ifdef ONLINE_JUDGE
- #else
- freopen("D:/c++/in.txt", "r", stdin);
- freopen("D:/c++/out.txt", "w", stdout);
- #endif*/
- int t ;
- scanf("%d" , &t);
- while(t--)
- {
- memset(dp , -1 , sizeof(dp));
- scanf("%d" , &n);
- for(int i = 1 ; i <= n ; i++)
- {
- for(int j = 1 ; j <= i ; j++)
- {
- scanf("%d" , &a[i][j]);
- }
- }
- cout << getsum(1 , 1) << endl ;
- }
- return 0;
- }
解法2、递归转为递推。从底层向上递推。
- //#include <bits/stdc++.h>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- #include <iostream>
- #include <string>
- #include <stdio.h>
- #include <queue>
- #include <stack>
- #include <map>
- #include <set>
- #include <string.h>
- #include<time.h>
- #include <vector>
- #define ME(x , y) memset(x , y , sizeof(x))
- #define SF(n) scanf("%d" , &n)
- #define rep(i , n) for(int i = 0 ; i < n ; i ++)
- #define INF 0x3f3f3f3f
- #define mod 20191117
- #define PI acos(-1)
- using namespace std;
- typedef long long ll ;
- int a[109][109];
- int n ;
- int dp[109][109];
- int main()
- {
- /*#ifdef ONLINE_JUDGE
- #else
- freopen("D:/c++/in.txt", "r", stdin);
- freopen("D:/c++/out.txt", "w", stdout);
- #endif*/
- int t ;
- scanf("%d" , &t);
- while(t--)
- {
- memset(dp , -1 , sizeof(dp));
- scanf("%d" , &n);
- for(int i = 1 ; i <= n ; i++)
- {
- for(int j = 1 ; j <= i ; j++)
- {
- scanf("%d" , &a[i][j]);
- }
- }
- for(int i = 1 ; i <= n ; i++)
- {
- dp[n][i] = a[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])+a[i][j];
- }
- }
- cout << dp[1][1] << endl ;
- }
- return 0;
- }
解法2优化空间
- //#include <bits/stdc++.h>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- #include <iostream>
- #include <string>
- #include <stdio.h>
- #include <queue>
- #include <stack>
- #include <map>
- #include <set>
- #include <string.h>
- #include<time.h>
- #include <vector>
- #define ME(x , y) memset(x , y , sizeof(x))
- #define SF(n) scanf("%d" , &n)
- #define rep(i , n) for(int i = 0 ; i < n ; i ++)
- #define INF 0x3f3f3f3f
- #define mod 20191117
- #define PI acos(-1)
- using namespace std;
- typedef long long ll ;
- int a[109][109];
- int n ;
- int dp[109];
- int main()
- {
- /*#ifdef ONLINE_JUDGE
- #else
- freopen("D:/c++/in.txt", "r", stdin);
- freopen("D:/c++/out.txt", "w", stdout);
- #endif*/
- int t ;
- scanf("%d" , &t);
- while(t--)
- {
- memset(dp , -1 , sizeof(dp));
- scanf("%d" , &n);
- for(int i = 1 ; i <= n ; i++)
- {
- for(int j = 1 ; j <= i ; j++)
- {
- scanf("%d" , &a[i][j]);
- }
- }
- for(int i = 1 ; i <= n ; i++)
- {
- dp[i] = a[n][i];
- }
- for(int i = n - 1 ; i >= 1 ; i--)
- {
- for(int j = 1 ; j <= i ; j++)
- {
- dp[j] = max(dp[j] , dp[j+1])+a[i][j];
- }
- }
- cout << dp[1] << endl ;
- }
- return 0;
- }
dp入门题(数塔)的更多相关文章
- 【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] = ...
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
- POJ 2342 树形DP入门题
有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...
- (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520
题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...
- 数字三角形/数塔问题(DP入门题)
有形如下图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的值最大. 样例输入: 5 13 11 8 12 7 26 6 14 15 8 12 7 ...
- HDU2084 数塔 (DP入门题)
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- HDU 2089 不要62【数位DP入门题】
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Hdu-1565 方格取数(1) (状态压缩dp入门题
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- hdu_Anniversary party_(树形DP入门题)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...
随机推荐
- StreamWriter、StreamReader
IO流操作文件内容,using System.IO;//引入命名空间 private void button1_Click(object sender, EventArgs e) { if (text ...
- jquery click()方法 语法
jquery click()方法 语法 作用:当点击元素时,会发生 click 事件.当鼠标指针停留在元素上方,然后按下并松开鼠标左键时,就会发生一次 click.click() 方法触发 click ...
- 原生Js_使用setInterval() 方法实现图片轮播功能
用javascript图片轮播功能 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- [CSP-S模拟测试]:集合合并(记忆化搜索)
题目传送门(内部题133) 输入格式 第一行一个正整数$n$. 第二行$n$个正整数$a_i$,表示一开始有$S_i=\{a_i\}$ 输出格式 输出一个非负整数表示最大的收益之和 样例 样例输入: ...
- [CSP-S模拟测试]:线性代数(模拟)
题目传送门(内部题113) 输入格式 第一行一个正整数$n$. 接下来$n$行,每行$n$个整数,描述$C$矩阵.保证输入的是一个林先森矩阵. 输出格式 若不可能实现,则输出一行$Impossible ...
- HTMLHint 配置文件
HTMLHint 工具可以对 HTML 代码做静态代码检查,从而保证 HTML 代码的规范和质量.HTMLHint 工具内置 23 条规则,建议在 .htmlhintrc 配置文件中将规则尽可能都打开 ...
- crossdomain.xml解决跨域问题
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- windows+VS+Openjdk12 搭建debug环境
openjdk12 下载地址: http://jdk.java.net/archive/ https://download.java.net/java/GA/jdk12/33/GPL/openjdk- ...
- C# NAudio 录制声音和显示波形图
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Python学习之==>循环
1.While循环 # 循环的时候是在重复执行循环体里面的东西 # 在循环体里面遇到break,立即结束循环,不管循环有没有完 # 在循环体里面遇到continue,那么就结束本次循环,继续进行下一次 ...