Description
Input
Output
Sample Input
1 3 8 9 10 10 10 10 -10 10 10 10 -11 -1 0 2 11 10 -20 -11 -11 10 11 2 10 -10 -10
和数字三角形差不多的dp,转移方程
if(i<n)dp[i+1][j]=max(dp[i+1][j],dp[i][j]+A[i+1][j]); if(j<m)dp[i][j+1]=max(dp[i][j+1],dp[i][j]+A[i][j+1]); int k=2; while(k*j<=m) { dp[i][k*j]=max(dp[i][k*j],dp[i][j]+A[i][k*j]); k++; }
#include <stdio.h> #include<algorithm> #include<cstring> #define INF 1<<30 int dp[25][1010],A[21][1001]; using std::max; int main() { //freopen("input.txt","r",stdin); int n,t,m; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(dp,0,sizeof(dp)); for(int j=1;j<=n;j++) for(int i=1;i<=m;i++) { scanf("%d",&A[j][i]); dp[j][i]=-INF; } dp[1][1]=A[1][1]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(i<n)dp[i+1][j]=max(dp[i+1][j],dp[i][j]+A[i+1][j]); if(j<m)dp[i][j+1]=max(dp[i][j+1],dp[i][j]+A[i][j+1]); int k=2; while(k*j<=m) { dp[i][k*j]=max(dp[i][k*j],dp[i][j]+A[i][k*j]); k++; } } printf("%d\n",dp[n][m]); } return 0; }
原文:http://blog.csdn.net/acvcla/article/details/24192229