万恶的动态规划题. 其实这题已经属于DP里面比较基础的了. 由下面的公式来写程序:
DP[i][j]=board[i][j],i=0;
DP[i][j]=max(DP[i−1][j−1],DP[i−1][j],DP[i−1][j+1])+borad[i][j],i>=1
然后注意的一点就是, 写程序的时候棋盘最两边的那俩只能取上排的两个哦…不然数组要越界…
代码如下:
//
// Created by Frank Yan on 2017/12/19.
//
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <string>
#include <vector>
#include <queue>
using namespace std;
int problem26(){
int t;
cin>>t;
for(int k=0;k<t;k++){
int n;
cin>>n;
int board[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>board[i][j];
int DP[n][n];
for(int j=0;j<n;j++)
DP[0][j] = board[0][j];
for(int i=1;i<n;i++)
for(int j=0;j<n;j++){
if(j!=0&&j!=n-1)
DP[i][j] = max(max(DP[i-1][j],DP[i-1][j-1]),DP[i-1][j+1])+board[i][j];
else if(j==0) DP[i][j] =max(DP[i-1][j],DP[i-1][j+1])+board[i][j];
else DP[i][j] = max(DP[i-1][j],DP[i-1][j-1]);
}
//cout<<DP[1][1]<<endl;
int result = -1;
for(int i=0;i<n;i++)
if(DP[n-1][i]>result)
result = DP[n-1][i];
cout<<"Case "<<k+1<<":"<<endl;
cout<<result<<endl;
if(k!=t-1) cout<<endl;
}
}