参考这篇文章做出了一些优化
问题描述:
长江俱乐部在长江设置了n个游艇出租站1,2,…n,游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),设计一个算法,计算出从出租站1到出租站n所需要的最少租金。
样例输入:
3
5 15
7
样例输出:
12
状态转移方程:fin[i][j] = min( fin[i][j] , fin[i][k] + fin[k][j])
#include <stdio.h>
#define MaxSize 1005
int r[MaxSize][MaxSize];
int fin[MaxSize][MaxSize];
void DP(int n)
{
int i, j, k, len, t;
for (len = 1; len < n; len++) {
for (i = 1; i < n; i++) {
j = len + i;
if (j > n) break;
fin[i][j] = fin[i][j - 1] + r[j - 1][j];
for (k = i + 1; k < j; k++) {
t = fin[i][k] + fin[k][j];
if (fin[i][j] > t) {
fin[i][j] = t;
}
}
}
}
printf("%d", fin[1][n]);
}
int main()
{
int i, j, n;
scanf("%d", &n);
for (i = 1; i < n; i++) {
for (j = i + 1; j <= n; j++) {
scanf("%d", &r[i][j]);
}
}
DP(n);
return 0;
}