ACM 动态规划 最大路径得分(课上)

问题:

  给定一个具有N层的数字三角形如下图,从顶至底有多条路径,每一步可沿左斜线向下或沿右斜线向下,路径所经过的数字之和为路径得分,请求出最大路径得分。

             7

            3 8

         8 1 0

        2 7 4 4

        4 5 2 6 5

用到记忆化搜索的方式,可以增加效率,用递归算法太慢了。。。

/*
    课上题目
    最大路径得分
*/
# include <iostream>

using namespace std;
const int MAX = 1e4;

int dp[MAX][MAX], a[MAX][MAX];

inline int max(int x,int y)
{
    return x < y ? y : x;
}
int main()
{
    int i, j, n;
    while(cin >> n)
    {
        for(i = 1; i <= n; i++)
            for(j = 1; j <= i; j++)
            cin >> a[i][j];

        // 最后一行
        for(j = 1; j <= n; j++)
            dp[n][j] = a[n][j];

        for(i = n - 1; i >= 1; i--)
            for(j = 1; j <= i; j++)
                dp[i][j] = a[i][j] + max(dp[i + 1][j], dp[i + 1][j + 1]);

        cout << dp[1][1] << endl;
    }
    return 0;
}
时间: 2024-07-30 19:41:22

ACM 动态规划 最大路径得分(课上)的相关文章

ACM 动态规划 最长上升子序列(课上)

输入数据 输入的第一行是序列的长度N (1 <= N <= 1000).第二行给出序列中的N 个整数,这些整数的取值范围都在0 到10000. 输出要求 最长上升子序列的长度. 输入样例 7 1 7 3 5 9 4 8 输出样例 4 /* 课上题目 最长上升子序列 */ # include <iostream> using namespace std; const int MAX = 1e5; int a[MAX + 10]; int len[MAX + 10]; int main

【DP专辑】ACM动态规划总结

转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ******************

课上Dijkstra算法练习

课上Dijkstra算法练习 Dijkstra算法,求解附图顶点A的单源最短路径,在纸上画出求解过程,上传截图.(注意图上要有自己的学号和姓名) 老师在上课时的ppt中讲解过程如下图: 参考理解最短路径--迪杰斯特拉(dijkstra)算法,得出完整的算法原理. ①首先,引入一个辅助向量D,它的每个分量D[i]表示当前所找到的 Dijkstra算法运行动画过程 Dijkstra算法运行动画过程 从起始点 (即源点 )到其它每个顶点 的长度.例如,D[3] = 2表示从起始点到顶点3的路径相对最小

20162301 课上测试 泛型类-Bag

20162301 课上测试 泛型类-Bag 题目及要求 代码运行在命令行中,路径要体现学号信息,IDEA中,伪代码要体现个人学号信息: 参见Bag的UML图,用Java继承BagInterface实现泛型类Bag,并对方法进行单元测试(JUnit),测试要涵盖正常.异常情况.边界情况: 课上提交测试代码和测试运行的结果截图,截图要求全屏截图,包含自己的学号信息,否则无效:测试Bag类的代码中至少包含一个自定义类如Student: 课下完成码云上代码的上传. Bag的UML图: 思路 参考了刘伟康

转载:动态规划以及路径记录

转自:http://www.cnblogs.com/stemon/p/4635256.html 题目:给定一个矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有的数字累加起来作为这条路径的路劲和.要求返回所有路径和中的最小路径和. 举例: 路径1,3,1,0,6,1,0是所有路径中路径和最小的,所以返回其和12. 解析: 这个题目很类似之前的那个动态规划的数字三角的问题.毫无疑问的,这个问题也是用动态规划解决.只要确定了状态和转移方程,这个题目很容易解决.下面直接给出

智慧解析第03课上:战国故事 相如出世

智慧解析第03课上:战国故事 相如出世,布布扣,bubuko.com

HDU 1160 FatMouse&#39;s Speed 动态规划 记录路径的最长上升子序列变形

题目大意:输入数据直到文件结束,每行两个数据 体重M 和 速度V,将其排列得到一个序列,要求为:体重越大 速度越低(相等则不符合条件).求这种序列最长的长度,并输出路径.答案不唯一,输出任意一种就好了. 题目思路:这是个最长上升子序列的问题,我们按W的升序进行排序,若W相等则按V的降序排序.用Pre[]记录当前点的前驱节点,Last记录序列最后一个点,maxn记录最长长度,完成动规后可根据Last和Pre[]输出路径. #include<cstdio> #include<stdio.h&

课上练习

package 课上作业; import java.util.InputMismatchException; import java.util.Scanner; public class Test { public static void main(String[] args) { for(int m=0;;) { int judge=0; Scanner in=new Scanner(System.in); int n; System.out.println("请输入帖子的个数:")

Construct Binary Tree from Inorder and Postorder Traversal (算法课上的题)

Construct Binary Tree from Inorder and Postorder Traversal 这道题之前算法课上好像遇到过,思路也很简单的. 思路:后序序列的最后一个元素就是树根,然后在中序序列中找到这个元素(由于题目保证没有相同的元素,因此可以唯一找到),中序序列中这个元素的左边就是左子树的中序,右边就是右子树的中序,然后根据刚才中序序列中左右子树的元素个数可以在后序序列中找到左右子树的后序序列,然后递归的求解即可.(在去除了根节点之后,中序遍历和后序遍历的前N个树都是