[关闭]
@darkproject 2019-04-15T13:27:09.000000Z 字数 628 阅读 623

水题

水题


openJ 2760 数字三jo形

题意:三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
设dp[i][j]为第i行j列所能得到的最大和,利用上下行关系列出状态转移方程dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+num[i][j],自下而上得到最后一行的所有列的状态再比较取最大值即为最后结果。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const int maxn =105;
  7. int n,dp[maxn][maxn];
  8. int num[maxn][maxn];
  9. int main()
  10. {
  11. while(cin>>n)
  12. {
  13. int ans=0;
  14. for(int i=1;i<=n;i++)
  15. for(int j=1;j<=i;j++)
  16. cin>>num[i][j];
  17. memset(dp,0,sizeof(dp));
  18. dp[1][1]=num[1][1];
  19. for(int i=2;i<=n;i++)
  20. for(int j=1;j<=i;j++)
  21. dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+num[i][j];
  22. for(int i=1;i<=n;i++)
  23. ans=max(ans,dp[n][i]);
  24. cout<<ans<<endl;
  25. }
  26. return 0;
  27. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注