HDU 2571 命运
简单DP
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; const long long INF=999999999999999; const int maxn=1000+10; long long a[20+10][maxn],dp[20+10][maxn]; int T,n,m; int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%lld",&a[i][j]); dp[i][j]=-INF; } dp[1][1]=a[1][1]; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { dp[i+1][j]=max(dp[i+1][j],dp[i][j]+a[i+1][j]); dp[i][j+1]=max(dp[i][j+1],dp[i][j]+a[i][j+1]); for(int k=j+j;k<=m;k=k+j) dp[i][k]=max(dp[i][k],dp[i][j]+a[i][k]); } } printf("%lld\n",dp[n][m]); } return 0; }