自己把自己坑的好惨。。 状态转移方程一下子就写出来了。 但是 细节总是被坑。。
每次走 向右走 一格 或者走 这一列的倍数。 向下走 只能走一格。
那么对于 某一个格子。 到达这个格子的最大值 就是
d【i】【j】 = max(d【i】【j】,d【i】【k】+ v【i】【j】) (k是j 的因子)
d【i】【j】 = max(d【i】【j】,d【i】【j-1】)
d【i】【j】 = max(d【i】【j】,d【i-1】【j】)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <fstream>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <vector>
#include <cmath>
#include <iomanip>
#include <cmath>
typedef long long LL;
typedef unsigned long long LLU;
const double PI=acos(-1.0);
using namespace std;
#define MAXN 1000+10
#define INF 1 << 30
int main (){
int t;
scanf("%d",&t);
while(t--){
int m,n;
scanf("%d%d",&m,&n);
int wh[21][MAXN] = {0};
int d[21][MAXN] = {0};
for(int i = 0; i <= 20; i++){
for(int j = 0; j <= 1000; j++)
d[i][j] = -INF;
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
scanf("%d",&wh[i][j]);
}
}
d[1][1] = wh[1][1];
for(int i = 1; i <= m; i++){
for(int j =1; j <= n; j++){
for(int k = 1; k <= j/2; k++){
if(k != j && (j%k == 0))
d[i][j] = max(d[i][j], d[i][k]+wh[i][j]);
}
if(i >= 2)
d[i][j] = max(d[i-1][j]+wh[i][j], d[i][j]);
if(j >= 2)
d[i][j] = max(d[i][j-1]+wh[i][j], d[i][j]);
}
}
printf("%d\n",d[m][n]);
}
return 0;
}

4万+

被折叠的 条评论
为什么被折叠?



