每晚例行一题!今天做的是这道,正好早上上人工智能课程时候讲到了动态规划算法,所以用在这一道题上。
题目大意是给你一个数字组成的三角形,从顶点数字依次向下走,但只能选择左下对角的数字和右下对角的数字。把沿路的数字加起来,求最大的数字和。简单来说就是这样:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
最终结果就是 7+3+8+7+5 = 30!
附代码:
#include<iostream>
#include<cstring>
using namespace std;
int a[1005][1005],dp[1005][1005];
int main(){
int n,i,j;
while(cin>>n){
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
cin>>a[i][j];
}
}
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
if(i==0)
dp[i][j]=a[i][j];
else{
if(j==0) dp[i][j]=dp[i-1][j]+a[i][j];
else dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j];
}
}
}
int output=0;
for(i=0;i<n;i++){
output=max(output,dp[n-1][i]);
}
cout<<output<<endl;
}
return 0;
}