ACM动态规划题

用C做,怎么做?不行的话C++也行啊
从三角形顶部到底部有很多条不同的路径,对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。任务:求最佳路径上的数字之和。

这是动态规划很经典的问题之一。。。
还有,想纠正LZ一个说法,“用C做,怎么做?不行的话C++也行啊”,感觉LZ觉得C++更厉害一些哈。。。其实不然,像LZ说的这种问题是算法问题,不基于某种编程语言的。。。
正题:
假设我们的实例是:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
我们可以用一个整型数组max[][]来存状态(这里就是动态规划),这个状态就是从顶上走到当前数字num[i][j]时和最大的那个和max[i][j]
程序运行完例子后,max中为这样的:
7
10 15
18 16 15
20 25 20 19
24 30 27 26 24
程序如下:
#include <stdio.h>
#include <stdlib.h>

#define MAX 100
int num[MAX][MAX];
int max[MAX][MAX];
int n;

int main() {
int i, j, _max;
scanf("%d", &n);
for (i=0; i<n; i++)
for (j=0; j<i+1; j++) {
scanf("%d", &num[i][j]);
max[i][j] = num[i][j];
}
for (i=0; i<n-1; i++)
for (j=0; j<i+1; j++) {
// 下一行的前一个数
if (max[i+1][j] < max[i][j] + num[i+1][j])
max[i+1][j] = max[i][j] + num[i+1][j];
// 下一行的后一个数
if (max[i+1][j+1] < max[i][j] + num[i+1][j+1])
max[i+1][j+1] = max[i][j] + num[i+1][j+1];
}
// 输出max[][]
for (i=0; i<n; i++) {
for (j=0; j<i+1; j++)
printf("%d ", max[i][j]);
putchar('\n');
}
// 输出max值
_max = max[n-1][0];
for (i=1; i<n; i++)
if (_max < max[n-1][i])
_max = max[n-1][i];
printf("%d\n", _max);
system("pause");
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-06-07
思路是这样的
三角形中每一个点都可以从上层的两个点到达该点,假如我们知道顶点分别到上层两个点的最优路径,选择数字之和最大的那条路径就是顶点到该点的最佳路径,也就是说如果我们知道顶点到第n层中每一个点的最佳路径,那么我们就可以求出顶点到第n+1层中每一个点的最佳路径,而第一层是最优路径是已知的,最终的结果就是从底层的n条路径中选一个数值最大的就是答案
第2个回答  2009-06-07
给楼主提供另一个思路
杨辉三角 计算权值

acm最大金额问题
ACM最大金额问题是指给定一个包含n个元素的整数序列,从中选择干个数,使得它们的和最大,不能选择相邻的两个数。ACM最大金额问题的解释ACM最大金额问题是一种经典的动态规划问题。需要使用动态规划算法,构建一个动态规划方程,并使用递推的方法来计算最大金额。

浙大ACM 1733 Segmentation Fault
这是经典的动态规划题目。设字符串为s,t。f[i][j]表示s前i个字母和t前j个字母组成的最长公共子序列长度。1L没说错,ab ba是1,最长公共自序列是最长公共子串(不要求连续,但要求顺序一致)状态转移方程:f[i][j] = f[i-1][j-1]+1 (s[i]==t[j])f[i][j] = max{ f[i-1]...

ACM动态规划问题,有一盒药片,每天吃半片,如果取出是一片的,则把剩...
dp[i][j][k]代表第i天的时候剩下的整片的有j片,半片的有K片的吃法 dp[i][j][k]=dp[i-1][j][k+1]+dp[i-1][j+1][k-1]\/\/这里是两种吃法,即吃半片或者吃一片的 初始条件dp[0][n][0]=1 不过这样的复杂度是n*n*n不知道符不符合你的要求.题目中的N是多大啊?能告诉...

求ACM大侠。数字金字塔,要用到动态规划。最好用C++。谢谢!
\/\/程序是用c写的,稍微弄下就变c++了 include <stdio.h> long l[1002][1002]={0}; \/\/数组比较大,所以用全局的 int main(){ int i,j,n;long max=0; \/\/max用来存最大的路径和 scanf("%d",&n);for(i=1;i<=n;i++)for(j=1;j<=i;j++){ scanf("%ld",&l[i][j])...

关于ACM的深搜和广搜以及动态规划
经典题目:细胞(NDK1435)、Tyvj:乳草的入侵、武士风度的牛 数值类型搜索:(虽然我也不知道该怎么叫,就起这个名字吧),这种类型的搜索就需要仔细分析分析了,一般来说采用DFS,而且它的终止条件一般都是很明显的,难就难在对于过程的把握,过程的把握类似于坐标类型的搜索(判重、深入、枚举),注意...

算法题套路总结(三)——动态规划
我一直在思考,到底是我变强了,还是因为LC的题目相比ACM或者NOI太简单了。其实主要还是后者,但是同时我也发现,动态规划其实是有套路的,我以前方法不对,总结太少。 主要就是,站在出题人的角度,他几乎不太可能完全凭空想出一个新的DP模型,因为动态规划毕竟要满足:因此,能够利用DP来解决的问题...

杭电ACM 1257 为什么老是WA?
这道题目是动态规划哈,不是贪心,是求最长递增子序列的.你可一直接百度一下 单调递增子序列或者直接百度 HDU 1257 你这算法肯定不对 所以错了.这道题要求最长递增子序列的长度,用二分+DP可求的。include <iostream> using namespace std;int result[30005]; \/\/用于保存最长递增子序列 int bi...

大学数学动态规划问题。
背包问题:01背包问题,完全背包问题,分组背包问题,二维背包,装箱问题,挤牛奶(同济ACM第1132题)等;动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的...

HDU 2079 链接: http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=2079_百度...
不知道你代码什么思路,这道题显然是动态规划的题目 思路:前i-1门课产生学分x的组合数为:ans[x]第i门课产生的学分的组合数为:ansnew[x]ansnew[0]=1;for(x=1;x<=n;x++)for(j=1;j<=num[i];j++){ if(x-price[i]*j<0)break;ansnew[x] += ans[x-price[i]*j];} 然后将...

杭电acm2517属什么类型题?
DP动态规划 见刘汝佳黑书 考虑左上角坐标为(x1,y1),右下角坐标为(x2,y2)的棋盘,设它把切割k次以后得到的k+1块矩形的总分平方和最小值为d[k,x1,y1,x2,y2]状态转移: 沿着某横线切或者竖线切,然后选一块继续切, 如横着切的两类决策是 d[k-1,x1,y1,a,y2]+s[a+1,y1,x2,y2]...

相似回答
大家正在搜