POJ1163 数学三角求最大路径
描述:
输入,行数,之后接数据,第一行一个数据,之后每行加一。
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
思路:
简单动态规划问题。
dp[i][j]定义为到这个数为止(包括这个数)的最大和,则:
dp[i][j] = max(d[i-1][j-1], d[i-1][j]),未考虑边界条件。
则用滚动数组得:
#include <iostream>
using namespace std; int main()
{
int n, more, ret;
cin >> n;
int* arr = new int[n];
int* new_arr = new int[n]();
bool flag = true; for (int i = ; i <= n; ++i) {
for (int j = ; j < i; ++j) {
if (j == ) {
cin >> more;
if (flag)
new_arr[j] = arr[j] + more;
else
arr[j] = new_arr[j] + more;
} else if (j == i - ) {
cin >> more;
if (flag)
new_arr[j] = arr[j - ] + more;
else
arr[j] = new_arr[j - ] + more;
} else {
cin >> more;
if (flag)
new_arr[j] = max(arr[j - ], arr[j]) + more;
else
arr[j] = max(new_arr[j - ], new_arr[j]) + more;
}
}
flag = !flag;
} ret = arr[];
if (!flag) {
int* d = arr;
delete []d;
arr = new_arr;
}
for (int i = ; i < n; ++i) {
if (ret < arr[i])
ret = arr[i];
}
delete []arr;
cout << ret;
}
再优化下空间:
考虑到每个数的更新,仅和上个数以及前一个数有关,可用一个变量保存前一个数,得:
#include <iostream>
using namespace std; int main() {
int n, more, ret;
cin >> n;
int* arr = new int[n](); for (int i = ; i <= n; ++i) {
int back = ;
for (int j = ; j < i; ++j) {
if (j == ) {
cin >> more;
back = arr[j];
arr[j] = arr[j] + more;
} else if (j == i - ) {
cin >> more;
arr[j] = back + more;
} else {
cin >> more;
int sa = arr[j];
arr[j] = max(back, arr[j]) + more;
back = sa;
}
}
} ret = arr[];
for (int i = ; i < n; ++i) {
if (ret < arr[i])
ret = arr[i];
}
delete []arr;
cout << ret;
return ;
}
虽然还有些可以优化,但时间和空间复杂度不变,若输入n行,则时间复杂度为O(n^2),空间复杂度为O(n)。
注意由于输入n行,则输入个数为n^2规模,所以n^2是时间复杂度下限。
POJ1163 数学三角求最大路径的更多相关文章
- hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。
/** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...
- POJ 1845-Sumdiv【经典数学题目---求因子和】
转载请注明出处:http://blog.csdn.net/lyy289065406/article/details/6648539 優YoU http://user.qzone.qq.com/289 ...
- HDU 3861--The King’s Problem【scc缩点构图 && 二分匹配求最小路径覆盖】
The King's Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 5105 Math Problem --数学,求导
官方题解: f(x)=|a∗x3+b∗x2+c∗x+d|, 求最大值.令g(x)=a∗x3+b∗x2+c∗x+d,f(x)的最大值即为g(x)的正最大值,或者是负最小值.a!=0时, g′(x)=3∗ ...
- <hdu - 1600 - 1601> Leftmost Digit && Rightmost Digit 数学方法求取大位数单位数字
1060 - Leftmost Digit 1601 - Rightmost Digit 1060题意很简单,求n的n次方的值的最高位数,我们首先设一个数为a,则可以建立一个等式为n^n = a * ...
- MT【51】一道三角求最值问题
[Genius is one percent inspiration and ninety-nine percent perspiration]--- 爱迪生 [Without the one per ...
- POJ 1741 Tree 求树上路径小于k的点对个数)
POJ 174 ...
- POJ - 3984 迷宫问题 BFS求具体路径坐标
迷宫问题 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, ...
- UVALive - 7831 :ACM Tax (主席树求树路径上中位数:LCA+主席树)
题意:给定一棵带权树,Q次询问,每次询问路径上的中位数. 思路:中位数分边数奇偶考虑,当当边数为num=奇时,结果就算路径第num/2+1大,用主席树做即可... (做了几道比较难的主席树,都wa了. ...
随机推荐
- mybatis单笔批量保存
在上一篇写了接口调用解析返回的xml,并赋值到实体.这一篇主要介绍,如何保存实体数据. 一,xml样例 <?xml version="1.0" encoding=" ...
- Java SE 8 流库(一)
1. 流的作用 通过使用流,说明想要完成什么任务,而不是说明如何去实现它,将操作的调度留给具体实现去解决: 实例:假如我们想要计算某个属性的平均值,那么我们就可以指定数据源和属性,然后,流库就可以对计 ...
- 重写ajax方法实现特定情况下跳转登录页面
jQuery(function($){ // 备份jquery的ajax方法 var _ajax=$.ajax; // 重写ajax方法, $.ajax=function(opt){ var _suc ...
- C语言--第三次作业
要求一 . 1)C高级第三次PTA作业(1) 题目6-1 1.设计思路 (1)主要描述题目算法 第一步:将月份分别赋值: 第二步:利用switch语句,输 ...
- CF1056:Check Transcription(被hack的hash)
One of Arkady's friends works at a huge radio telescope. A few decades ago the telescope has sent a ...
- UOJ117. 欧拉回路【欧拉回路模板题】
LINK 题目大意 就是让你对有向图和无向图分别求欧拉回路 非常的模板,但是由于UOJ上毒瘤群众太多了 所以你必须加上一个小优化 就是每次访问过一个边就把它删掉 有点像Dinic的当前弧优化的感觉 注 ...
- CH3201 Hankson的趣味题
题意 3201 Hankson的趣味题 0x30「数学知识」例题 描述 Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson ...
- jeecg中的树形控件demo
1.comboTree控件 1.页面方法: <t:comboTree url="jeecgFormDemoController.do?getComboTreeData" va ...
- 黄聪:WIN7下回收站不小心删除的文件怎么恢复,免费数据恢复软件下载
上网找了半天,大多数是收费的,总算找到一款免费的,已经帮我恢复了数据了,在此分享给大家. 注意:只能恢复7天内的,而且数据误删了,就尽量不要再修改你那个盘符的数据了,免得覆盖了! 我用的数据恢复软件R ...
- ThinkJava-压缩
尽管存在许多种压缩算恙,但是Zip和GZIP可能是最常用的.因此我们可以很容易地使用多 种可读写这些格式的工具来操纵我们的压缩数据. 1 用GZIP进行简单压缩 GZIP接口非常简单, 因此如果我 ...