题目链接:命运
题目大意:给你一个n*m的格子,如果当前格子是(x,y),下一步可以是(x+1,y),(x,y+1)或者(x,y*k) 其中k>1。然后算最后一格的价值
题目思路:直接dp就好,初始化一下负数小值
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
ll t,n,m,a[25][10005],dp[25][10005];
int main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&m);
for(ll i = 1;i <= n;i++)
for(ll j = 1;j <= m;j++)
scanf("%lld",&a[i][j]);
for(ll i = 0;i <= n;i++)
for(ll j = 0;j <= m;j++)
dp[i][j] = -inf;
dp[1][1] = a[1][1];
for(ll i = 1;i <= n;i++){
for(ll j = 1;j <= m;j++){
for(ll k = 1;k < j;k++){
if(j % k == 0)
dp[i][j] = max(dp[i][j],dp[i][k]+a[i][j]);
}
dp[i][j] = max(max(dp[i][j],dp[i-1][j]+a[i][j]),dp[i][j-1]+a[i][j]);
}
}
printf("%lld\n",dp[n][m]);
}
return 0;
}