题意:求走过路的最大和。
思路:dp
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
const int maxn=110;
int a[maxn*3][maxn];
int dp[maxn*3][maxn];
int b[maxn];
int main(){
int t; scanf("%d",&t);
for(int cas=1; cas<=t; cas++) {
memset(a,0,sizeof(a));
int n; scanf("%d",&n);
for(int i=1; i<=n; i++) {
for(int j=1; j<=i; j++) scanf("%d",&a[i][j]);
}
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++) {
for(int j=1; j<=i; j++) {
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j];
}
}
memset(b,0,sizeof(b));
for(int i=1; i<=n; i++) b[i]+=dp[n][i];
memset(dp,0,sizeof(dp));
for(int i=n+1; i<=n*2-1; i++) {
for(int j=1; j<=2*n-i; j++) scanf("%d",&a[i][j]);
}
for(int i=n*2-1; i>=n; i--){
for(int j=1; j<=2*n-i; j++) {
dp[i][j]=max(dp[i+1][j-1],dp[i+1][j])+a[i][j];
}
}
for(int i=1; i<=n; i++) b[i]+=dp[n][i];
int Max=-1000000;
for(int i=1; i<=n; i++) {
Max=max(Max,b[i]-a[n][i]);
}
printf("Case %d: %d\n",cas,Max);
}
return 0;
}