王道机试指南 例题12.11 Monkey Banana
题目:
题目大意:
算法及思路:
这道题和上道例题12.10一样,采用动态规划即可,只是需要变换下半部分输入位于matrix矩阵中的位置,将其放到矩阵的最右边即可。状态转移方程依旧是:
代码:
#include <iostream>
using namespace std;
int main(){
    int t;
    cin>>t;
    for(int k=0;k<t;k++){
        int n0;
        cin>>n0;
        int m,n;
        m=2*n0,n=n0+1;//调整矩阵大小,矩阵最下面和最右边分别补一行0和一列0,方便处理时不越界
        int matrix[m][n],dp[m][n];
        for(int i=0;i<m;i++)//初始化
            for(int j=0;j<n;j++){
                matrix[i][j]=0;
                dp[i][j]=0;
            }
        for(int i=0;i<n0;i++)//上半部分输入位置不变
            for(int j=0;j<i+1;j++)
                cin>>matrix[i][j];
        for(int i=n0;i<m-1;i++)//调整下半部分输入位置
            for(int j=i-n0+1;j<n-1;j++)
                cin>>matrix[i][j];
        for(int i=m-2;i>=0;i--)
            for(int j=0;j<n-1;j++)
                dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+matrix[i][j];//状态转移方程
        cout<<"case "<<k+1<<": "<<dp[0][0]<<endl;
    }
    return 0;
}
运行结果:
查看9道真题和解析
