题目链接:Problem - 2571 (hdu.edu.cn)
题目:
题目样例:
题目思路:
起始点的dp[i][j]就是a[i][j];
有边界所以需要考虑边界问题:
当在最上方时:dp[i][j]一定是由它的左侧侧推导得出,是dp[i][j-1]或者是dp[i][j的因数];
当在最左侧时:dp[i][j]一定是由它的上方推出,只能是dp[i-1][j];
其余位置:dp[i][j]则由它的上方和左侧得出,取最大值。
AC:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1005;
int t,n,m;
int a[N][N];
int dp[N][N];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
dp[1][1]=a[1][1];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int maxx=INT_MIN;
for(int k=1;k<j;k++){
if(j%k==0){
maxx=max(dp[i][k],maxx);
}
}
if(i==1&&j==1)continue;
else if(i==1){
dp[i][j]=max(dp[i][j-1],maxx)+a[i][j];
}else if(j==1){
dp[i][j]=dp[i-1][j]+a[i][j];
}else{
dp[i][j]=max(dp[i-1][j],max(dp[i][j-1],maxx))+a[i][j];
}
}
}
cout<<dp[n][m]<<endl;
}
return 0;
}