洛谷P1006 传纸条 dp

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();
}

猜你喜欢

转载自www.cnblogs.com/lyhhahaha/p/10022328.html