这道题第一个是数据的输入要注意,然后我最开始做的时候想着要不每排进行排序,然后取最大的,相加,但是是wrong anwser,然后参考了一下其他人的代码,dp会好一点
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int dp[220][220],map[220][220];
int main()
{
int T,n,j,k,i,cas=1;
cin>>T;
while(T--)
{
cin>>n;
memset(map,0,sizeof(map));
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
cin>>map[i][j];
}
k=n-1;
for(i=n+1;i<2*n;i++,k--)
{
for(j=1;j<=k;j++)
cin>>map[i][j];
}
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
dp[i][j]=map[i][j]+max(dp[i-1][j],dp[i-1][j-1]);
}
}
k=n-1;
for(i=n+1;i<2*n;i++,k--)
{
for(j=1;j<=k;j++)
dp[i][j]=map[i][j]+max(dp[i-1][j],dp[i-1][j+1]);
}
printf("Case %d: %d
",cas++,dp[2*n-1][1]);
}
return 0;
}