长江游艇俱乐部在长江上设置了n个游艇出租站1,2,3,……,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j)1<=i<j<=n。
对于给定的游艇出租站i到游艇出租站j之间的租金为r(i,j),1<=i<j<=n,编程计算从游艇出租站1到游艇出租站n所需的最少租金。输入第1行中有1个正整数n(n<=200),表示有n个游艇出租站,接下来是n-1个r(i,j),1<=i<j<=n。输出从游艇出租站1到游艇出租站n所需的最少租金。
#include "iostream"
using namespace std;const int ArraySize=20;
/*将一个大问题分解成小问题,
比如计算1-3,2-4,3-4,4-5,5-6,6-7,……,(n-2)-n,宽度为2
再计算1-4,2-5,3-6,4-7,……,(n-3)-n,宽度为3
最后计算1-n,宽度为n-1*/
int MinExpence(int a[][ArraySize],int n)
{
for(int k=2;k<n;k++)
{
for(int i=0;i<n-k;i++)
{
int j=i+k;
for(int p=i+1;p<j;p++)
{
int temp=a[i][p]+a[p][j];
if(temp<a[i][j])
a[i][j]=temp;
}
}
}
return a[0][n-1];//最少租金为a[0][n-1]
}
void Init()//初始化数组
{
int a[ArraySize][ArraySize]={0,0};
int n;
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
cin>>a[i][j];
}
cout<<MinExpence(a,n)<<endl;//输出最小的游艇租金
}
int main(int argc, char* argv[])
{
Init();
return 0;
}