称号:
迷宫的每个格子都受到幸运女神眷恋或者痛苦魔王的诅咒,所以每个格子都相应一个值,走到那里便自己主动得到了相应的值。
如今规定yifenfei仅仅能向右或者向下走,向下一次仅仅能走一格。可是假设向右走,则每次能够走一格或者走到该行的列数是当前所在列数倍数的格子。即:假设当前格子是(x,y),下一步能够是(x+1,y),(x,y+1)或者(x,y*k) 当中k>1。
为了可以最大把握的消灭魔王lemon。yifenfei希望可以在这个命运大迷宫中得到最大的幸运值。
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
52
主要是考虑在第1行第1 列的情况,所以要细致推断。。。
这部分注意代码为:
if(i==1&&j==1) continue; if(i==1&&j!=1) dp[i][j]=dp[i][j-1]; if(j==1&&i!=1) dp[i][j]=dp[i-1][j]; if(i!=1&&j!=1) dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int map[25][1005],dp[25][1005]; int main() { int t,n,m,i,j,k; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&map[i][j]); memset(dp,0,sizeof(dp)); dp[1][1]=map[1][1]; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(i==1&&j==1) continue; if(i==1&&j!=1) dp[i][j]=dp[i][j-1]; if(j==1&&i!=1) dp[i][j]=dp[i-1][j]; if(i!=1&&j!=1) dp[i][j]=max(dp[i-1][j],dp[i][j-1]); for(k=2;k<=m;k++) { if((double)j/k==j/k) dp[i][j]=max(dp[i][j],dp[i][j/k]); } dp[i][j]+=map[i][j]; } } printf("%d\n",dp[n][m]); } return 0; }
版权声明:本文博主原创文章。博客,未经同意不得转载。
原文:http://www.cnblogs.com/bhlsheji/p/4874252.html