题意:数字排成三角形,求从顶点加到底,最大的和是多少。每个点只能加跟它直接相连的其中一个
分析:
数塔是经典的dp模型,从底往上推,每次找最大的往上一层加,最后归总到顶点,结果就是顶点的值。
dp[i][j]:加到dp[i][j]第i行第j个数时的最大和;dp[i][j]=dp[i][j]+max(dp[i+1][j],dp[i+1][j+1])
代码:
#include<iostream> #define max(a,b) a>b?a:b; using namespace std; int main() { int t,n; int a[10000],dp[110][110]; cin>>t; while(t--){ cin>>n; int m=n*(n+1)/2; for(int i=1;i<=m;i++) cin>>a[i]; dp[1][1]=a[1]; for(int i=2;i<=n;i++) for(int j=1;j<=i;j++) dp[i][j]=a[(i-1)*i/2+j]; for(int i=n-1;i>=1;i--){ for(int j=1;j<=i;j++){ dp[i][j]+=max(dp[i+1][j+1],dp[i+1][j]); } } cout<<dp[1][1]<<endl; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/ac_0_summer/article/details/46926395