dp[i][j][k]表示走了i步(即横坐标+纵坐标为i),左边点的横坐标为j,右边点的横坐标为k(k>j)时经过的最大好心程度
状态方程dp[i][j][k]=a[i-j][j]+a[i-k][k]+max(dp[i-1][j][k-1],dp[i-1][j-1][k],dp[i-1][j][k],dp[i-1][j-1][k-1])
#include<iostream> using namespace std; int m,n,a[55][55]; int dp[105][55][55];//第一维是步数,第二维是下面数的横坐标,第三维是上面数的横坐标 void solve() { cin>>m>>n; int i,j,k; for(i=1;i<=m;i++) for(j=1;j<=n;j++)cin>>a[i][j]; for(i=3;i<=m+n;i++) for(j=1;j<=n;j++)//上面点的横坐标 (纵坐标是i-j) for(k=j+1;k<=n+1;k++)//下面点的横坐标 (纵坐标是i-k) { int s=0; if(k-1>=j&&j<i-1)s=dp[i-1][j][k-1];//上一个状态横坐标j,k-1(j不等于j,纵坐标大于等于1) if(s<dp[i-1][j][k]&&j<i-1&&k<i-1)s=dp[i-1][j][k];//上一个状态横坐标j,k(纵坐标大于等于1) if(s<dp[i-1][j-1][k]&&k<i-1)s=dp[i-1][j-1][k];//上一个状态横坐标j-1,k if(s<dp[i-1][j-1][k-1])s=dp[i-1][j-1][k-1]; dp[i][j][k]=s+a[i-j][j]+a[i-k][k]; } cout<<dp[m+n][n][n+1]<<endl; } int main() { solve(); }