HDU 2571 命运 (入门dp)
题意:二维矩阵,左上角为起点,右下角为终点,如果当前格子是(x,y),下一步可以是(x+1,y),(x,y+1)或者(x,y*k) ,其中k>1。问最大路径和。
题解:入门dp,注意负数即可。
#include <bits/stdc++.h> using namespace std; int t,n,m,dp[25][1005],data[25][1005]; int main() { cin>>t; while(t--) { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>data[i][j]; //若全部初始化为0 行走过程可能会跳过负数 for(int i=1;i<=n;i++) dp[i][0]=-999999; for(int j=1;j<=m;j++) dp[0][j]=-999999; dp[0][1]=dp[1][0]=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { dp[i][j]=max(dp[i][j-1],dp[i-1][j]); for(int k=1;k<j;k++) { if(j%k==0) dp[i][j]=max(dp[i][j],dp[i][k]); //注意不是j/k j/k不会遍历1 } dp[i][j]+=data[i][j]; } printf("%d\n",dp[n][m]); } return 0; } /* 1 1 4 100 -5 -6 3 */