算法学习(个人学习篇,更新中...)
目录
1.数字三角形问题
2.租用游艇问题
emmmm由于本人比较懒又是写给自己看的,所以题目我就直接拍照啦。
1.题目描述如下:
思路:第一反应是从上往下,不停找到最大值,但是由于路径有限制,每个元素只能向下向外扩展两个位置,再继续比较,些许麻烦。所以我们从下往上走(逆向思维很重要),从最后一行开始,第一个和第二个比较,找出较大的那个,与上一行他俩中间的那个数相加,这样一直比较再相加,最后可以得到4个较大的数,替换掉上一行的数,当然我们也可以再定义一个数组来存。以此类推,倒数第二行找出3个数加到倒数第三行,加啊加加到最后,加到第一行的时候就是最大值了,输出就行了。
源码(在这里我定义了一个新的数组存储得到的值):
//数字三角形问题
#include <iostream>
using namespace std;
int main()
{
int a[100][100];
int aMaxSum[100][100];
int n, i, j;
cin >> n;
for(i=1; i<=n; i++)
{
for(j=1; j<=i; j++)
{
cin >> a[i][j];
}
}
for(j=1; j<=n; j++)
{
aMaxSum[n][j] = a[n][j];
}
for(i=n; i>1; i--)
{
for(j=1; j<i; j++)
{
if(aMaxSum[i][j]>aMaxSum[i][j+1])
aMaxSum[i-1][j] = aMaxSum[i][j] + a[i-1][j];
else
aMaxSum[i-1][j] = aMaxSum[i][j+1] + a[i-1][j];
}
}
cout << aMaxSum[1][1];
return 0;
}
2.题目描述如下:
思路:考察的是,间接花费和直接花费哪个更小。假设m[i]是从站1到站i的最小花费,那么实际上m[i] = min( m[i], m[j] + r(j, i) ) ,哪个小就取哪个。
源码:
//租用游艇问题
#include <iostream>
using namespace std;
int PickSmall(int x,int y){ //两数比较取小的
if(x<y) return x;
return y;
}
int main()
{
int r[100][100];
int m[100][100] = {0};
int n;
cin >> n;
for(int i=1; i<n; i++)
{
for(int j=i+1; j<=n; j++)
{
cin >> r[i][j];
}
}
int min[n+1]={0}; //记录从第一个站点到第i个站点的最优解(最少花费)
for(int i=2;i<=n;i++){
min[i]=r[1][i];
for(int j=1;j<i;j++){
min[i]=PickSmall(min[i],min[j]+r[j][i]);
}
}
cout<<min[n]<<endl;
return 0;
}