问题
给定一个数字三角形,从顶至底有多条路径,每一步可沿左斜线向下或沿右斜线向下,路径所经过的数字之和为路径得分,请求出最小路径得分。
输入
数字三角形的行数和数字三角形
输出
最小的路径和
输入样例
5
7
8 3
9 8 7
1 2 3 4
4 5 6 7 8
输出样例
25
问题分析
从顶点开始,自顶向下计算。给定数字三角形a[i][j],1<=i<=n,1<=j<=n. 设dp[i][j]表示从顶点到位置(i,j)的最小路径和,则有dp[i][j]=min(dp[i-1][j-1],dp[i-1][j])+a[i][j],1<=i<=n,1<=j<=n。
完整代码
#include<iostream>
using namespace std;
const int INF=0x3f3f3f3f;
long long dp[105][105];
int main(){
int n;
long long a[105][105];
int i,j;
cin>>n;
for(i=0;i<=104;i++){
for(j=0;j<=104;j++){
a[i][j]=INF;
if(i!=0)dp[i][j]=INF;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
cin>>a[i][j];
dp[i][j]=0;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
dp[i][j]=min(a[i][j]+dp[i-1][j],a[i][j]+dp[i-1][j-1]);
// cout<<dp[i][j]<<" ";
}
// cout<<endl;
}
long long ans=INF;
for(i=1;i<=n;i++){
if(dp[n][i]<ans)ans=dp[n][i];
}
cout<<ans;
return 0;
}