题目链接:http://acm.hust.edu.cn/vjudge/contest/121396#problem/F
题意:这个题与那个数组三角形的题差不多,只不过是多了一个倒三角而已;
分析:需要注意的是定义一个怎样的状态,根据这个状态写出状态转移方程
状态转移方程: dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j] 上三角
dp[i][j]=max(dp[i-1][j],dp[i-1][j+1])+a[i][j] 下三角
AC代码:
#include <iostream>
#include<cstdio>
#include<algorithm> #include<cstring> using namespace std; int dp[1050][1050]; int a[1050][1050]; int main() { int t,n,ans;; scanf("%d",&t); ans=1; while(t--) { scanf("%d",&n); memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); for(int i=1; i<=n; i++) for(int j=1; j<=i; j++) scanf("%d",&a[i][j]); for(int i=n+1; i<2*n; i++) for(int j=1; j<=2*n-i; j++) scanf("%d",&a[i][j]); dp[1][1]=a[1][1]; for(int i=1; i<=n; i++) for(int j=i; j>=1; j--) dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j]; for(int i=n+1; i<2*n; i++) for(int j=1; j<=2*n-i; j++) dp[i][j]=max(dp[i-1][j],dp[i-1][j+1])+a[i][j]; printf("Case %d: %d\n",ans++,dp[2*n-1][1]); } return 0; }