最好懂得贪心算法+动态规划之数塔问题

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 const int N=100;
 5 int tower[N][N],f[N][N]={0},n;
 6 void upMax(int &a,const int &b){
 7     a=(a>b?a:b);
 8 }
 9 int main(){
10     cin>>n;
11     for(int i=1;i<=n;i++){
12         for(int j=1;j<=i;j++){
13         cin>>tower[i][j];
14         }
15     }
16     //接下来 用贪心算法和动态规划
17     //这里用了贪心算法,每一步算出每一行的最大值,最后得到总体最大
18     for(int i=1;i<=n;i++){
19         for(int j=1;j<=i;j++){
20           upMax(f[i][j],max(f[i-1][j],f[i-1][j-1])+tower[i][j]);
21         }
22     }
23     int res=0;
24     for(int i=0;i<=n;i++){
25         //cout<<f[n][i]<<endl;
26         upMax(res,f[n][i]);
27     }
28     cout<<res<<endl;
29 }

1.求出最大值函数,并将之返回给第一个参数,当然指针和引用都可以实现

2.贪心算法求出每一行的最大值:对于每一个位置,都可以求出上面所有的路径到达这点的最大值,存在f[i][j]中

3.比较最后一行的f[n][i],求出最大值就是结果

时间: 2024-10-13 03:30:53

最好懂得贪心算法+动态规划之数塔问题的相关文章

动态规划:数塔问题

动态规划问题我训练过一些题目,但是感觉自己掌握的还不是特别好! 下面以一道经典的动态规划题目说明动态规划算法的思想,文末会官方的给出对动态规划的文字叙述. 先看题目:如下图(图片来自百度图片)是一个数塔,从顶部出发在每一个节点可以选择向左或者向右走,一直走到底层,要求找出一条路径,使得路径上的数字之和最大. 思路分析: 这道题目如果使用贪婪算法不能保证找到真正的最大和. 在用动态规划考虑数塔问题时可以自顶向下的分析,自底向上的计算. 从顶点出发时到底向左走还是向右走应取决于是从左走能取到最大值还

c++动态规划解决数塔问题

#include <iostream>#include <algorithm> using namespace std; /************************************************************************//* 数塔问题 *//************************************************************************/const int N = 50;//为了算法写

贪心算法练习(一)

贪心算法_删数问题 AYYZOJ p1420 删数问题,算法在上一篇中讲得很详细,注意最后输出数前的零要去掉. 1 var n:string; 2 s,i:integer; 3 begin 4 readln(n); 5 readln(s); 6 while s>0 do 7 begin 8 i:=1; 9 while(i<length(n))and(n[i]<=n[i+1])do inc(i); 10 delete(n,i,1); 11 dec(s); 12 end; 13 while

贪心算法练习(二)

NOIP2002_T1_均分纸牌 AYYZOJ p1030 COGS p98 分析:见此课件的例7 程序:见NOIP2002 提高组 贪心算法_取数游戏 AYYZOJ p1425 分析:本题可以这样理解,有2n个数,A从开头取的话取第一个,给对手留下的是第2个和第2n个,即对手只能选偶数位的数,A以此法可以取走全部的奇数位的数,同理也可以取走偶数位的数.所以,只要将所有奇数位和偶数位的数比较,大的A选,小的对手选,即可 1 var 2 a,n,i,suma,sumb:longint; 3 beg

(hdu step 3.2.7)免费馅饼(数塔变形:求所能接到馅饼的最大数)

题目: 免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1207 Accepted Submission(s): 508   Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米

贪心算法,递归算法,动态规划算法比较与总结

一般实际生活中我们遇到的算法分为四类: 一>判定性问题        二>最优化问题        三>构造性问题        四>计算性问题 而今天所要总结的算法就是着重解决  最优化问题 <算法之道>对三种算法进行了归纳总结,如下表所示:   标准分治 动态规划 贪心算法 适用类型 通用问题 优化问题 优化问题 子问题结构 每个子问题不同 很多子问题重复(不独立) 只有一个子问题 最优子结构 不需要 必须满足 必须满足 子问题数 全部子问题都要解决 全部子问题都要

动态规划——数塔问题

从数塔顶层出发,每个结点可以选择向左走或向右走,要求一直走到塔底,使得走过的路径上的数值和最大. #include <iostream> #include <cstdio> using namespace std; const int N = 100; // 下面这个函数实现的是更新最大值,o赋值为o和x的最大值 template <class T> void updateMax(T& o, const T& x) { o = (o > x) ?

分治法、动态规划、回溯法、分支界限法、贪心算法

转:http://blog.csdn.net/lcj_cjfykx/article/details/41691787 分治算法一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时

背包问题:动态规划和贪心算法

1. 动态规划 以下关于动态规划的文字描述来源 动态规划之背包问题(一) 作者:Hawstein 出处:http://hawstein.com/posts/dp-knapsack.html 一切都要从一则故事说起. 话说有一哥们去森林里玩发现了一堆宝石,他数了数,一共有n个. 但他身上能装宝石的就只有一个背包,背包的容量为C.这哥们把n个宝石排成一排并编上号: 0,1,2,-,n-1.第i个宝石对应的体积和价值分别为V[i]和W[i] .排好后这哥们开始思考: 背包总共也就只能装下体积为C的东西