ACM动态规划题

来源:百度知道 编辑:UC知道 时间:2024/05/31 19:54:06
用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][