SHAOXIAOJ正在加载中...

2617: 动态规划-游艇问题

金币值:3 定数:7 时间限制:1.000 s 内存限制:128 M
正确:4 提交:4 正确率:100.00% 命题人:
点赞量:0 收藏量:0 题目类型:程序 知识点: 算法设计

题目描述

长江游艇俱乐部在长江上设置了 $n$ ($n<=10$)个游艇出租站 $1,2,…,n$。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站 $i$ 到游艇出租站 $j$ 之间的租金为 $r$($i,j$),$1≤i<j≤n$。要求设计一个算法,计算出从游艇出租站 $1$ 到游艇出租站 $n$ 所需的最少租金(使用动态规划法)。
要求:
第 $1$ 行输入 $1$ 个整数,表示有n个出租站点。
第 $2$ 行输入 $n-1$ 个整数,依次表示第1个站点到第 $i$($1<i\le n$)个站点的租金。
第 $3$ 行输入 $n-2$ 整数,依次表示第2个站点到第 $i$($2<i\le n$)个站点的租金。
...
第 $n$ 行输入 $1$ 整数,依次表示第 $n-1$ 个站点到第 $i$($n-1<i\le n$)个站点的租金。
最后 $1$ 行直接输出第1个出租点到第 $n$ 个出租点的最小租金。

测试代码   复制

#include <stdio.h>

int m[11][11]; // 假设下标为0的位置不存储有效数据

int f(int n) {
	int i,j,k,p;
	for(i=1; i<=n; i++) m[i][i]=0; // 给主对角线(第1条对解线)赋值
        ___________________________ 
        return m[1][n];
}

int main(void) {
	int i,j,n,result; 
	scanf("%d",&n);
	for(i =1; i < n; i++ )
		for(j =i+1; j <= n; j++ )
			scanf("%d",&m[i][j]);
	result=f(n);
	printf("%d\n",result);
	return 0;
}

输入样例    复制

5
2  4  6  8
1  2  3
1  2
3

输出样例    复制

5

提示

算法设计思路:先写出计算 $m[i][j]$ 值的递归式,然后根据递归式设计动态规划算法。
另外,如果本题不用动态规划,而是直接利用递归求解,则可参考下列程序代码(当问题规模比较大时,该代码的执行效率较低)
#include <stdio.h>

int m[11][11]; // 假设下标为0的位置不存储有效数据

int f(int i, int j) {

	if(i==j) {
		return 0;
	}else{    
	    int min=m[i][j];
	    for(int k=i+1; k<j; k++) {
		_______________
	    }
	    return min;
    }
}

int main(void) {
	int i,j,n,result;
	scanf("%d",&n);
	for(i =1; i < n; i++ )
		for(j =i+1; j <= n; j++ )
			scanf("%d",&m[i][j]);
	result=f(1,n);
	printf("%d\n",result);
	return 0;
}