HDU 2571 命运
作者:互联网
这题是动态规划,枚举
状态表示:dp[i][j]代表从(1,1)走到(i,j)位置可以获得的最多幸运值
转移方程:(1)如果i==1并且j==1幸运值就为a[i][j]的本身
(2)如果i-1>0 dp[i][j]=max(dp[i][j],dp[i-1][j]+a[i][j]);
(3)如果j-1>0 dp[i][j]=max(dp[i][j],dp[i][j-1]+a[i][j]);
(4)枚举1~j-1,如果k是j的因数,代表dp[i][j]可以从dp[i][j/k]转移而来 dp[i][j]=max(dp[i][j],dp[i][j/k]+a[i][j]);
边界:dp[i][j]的初值为-1010,这样方便取max
#include<bits/stdc++.h> using namespace std; const int N=1010; int t,n,m,a[N][N],dp[N][N]; 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("%d",&a[i][j]); dp[i][j]=-1010; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(i==1&&j==1) { dp[i][j]=a[i][j]; continue; } if(i-1>0) dp[i][j]=max(dp[i][j],dp[i-1][j]+a[i][j]); if(j-1>0) dp[i][j]=max(dp[i][j],dp[i][j-1]+a[i][j]); for(int k=1;k<j;k++) { if(j%k==0) dp[i][j]=max(dp[i][j],dp[i][k]+a[i][j]); } } printf("%d\n",dp[n][m]); } return 0; }
标签:HDU,命运,int,max,scanf,2571,幸运值,1010,dp 来源: https://www.cnblogs.com/Siv0106/p/11712827.html