这道题第一个是数据的输入要注意,然后我最开始做的时候想着要不每排进行排序,然后取最大的,相加,但是是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; }