这个题就是裸的到处比较一下就可以了
关键点是找出哪几个值是不用算的
这样看其实是最后一列不用算
#include<iostream>
#include<algorithm>
#include<memory.h>
#include<cstdio>
using namespace std;
int zhi[21][1001];
int dp[21][1001];
int main()
{
int T;
cin>>T;
while(T--)
{
int n,m;
memset(dp,0,sizeof(dp));
memset(zhi,0,sizeof(zhi));
cin>>n>>m;
for(int a=1;a<=n;a++)
{
for(int b=1;b<=m;b++)
{
scanf("%d",&zhi[a][b]);
dp[a][b]=zhi[a][b];
}
}
for(int q=m-1;q>=1;q--)
{
int maxx=dp[n][q+1];
for(int c=2;c*q<=m;c++)
{
maxx=max(maxx,dp[n][c*q]);
}
dp[n][q]=zhi[n][q]+maxx;
}
for(int a=n-1;a>=1;a--)dp[a][m]=zhi[a][m]+dp[a+1][m];
for(int a=n-1;a>=1;a--)
{
for(int b=m-1;b>=1;b--)
{
int maxx=-500000;
maxx=max(dp[a][b+1],dp[a+1][b]);
for(int c=2;c*b<=m;c++)
{
maxx=max(maxx,dp[a][c*b]);
}
dp[a][b]=zhi[a][b]+maxx;
}
}
cout<<dp[1][1]<<endl;
/*for(int a=1;a<=n;a++)
{
for(int b=1;b<=m;b++)
{
cout<<dp[a][b]<<" ";
}
cout<<endl;
}*/
}
return 0;
}