B - 命运

穿过幽谷意味着离大魔王lemon已经无限接近了! 
可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关。要知道,不论何人,若在迷宫中被困1小时以上,则必死无疑! 
可怜的yifenfei为了去救MM,义无返顾地跳进了迷宫。让我们一起帮帮执着的他吧! 
命运大迷宫可以看成是一个两维的方格阵列,如下图所示: 
 
yifenfei一开始在左上角,目的当然是到达右下角的大魔王所在地。迷宫的每一个格子都受到幸运女神眷恋或者痛苦魔王的诅咒,所以每个格子都对应一个值,走到那里便自动得到了对应的值。 
现在规定yifenfei只能向右或者向下走,向下一次只能走一格。但是如果向右走,则每次可以走一格或者走到该行的列数是当前所在列数倍数的格子,即:如果当前格子是(x,y),下一步可以是(x+1,y),(x,y+1)或者(x,y*k) 其中k>1。 
为了能够最大把握的消灭魔王lemon,yifenfei希望能够在这个命运大迷宫中得到最大的幸运值。 
 

Input

输入数据首先是一个整数C,表示测试数据的组数。 
每组测试数据的第一行是两个整数n,m,分别表示行数和列数(1<=n<=20,10<=m<=1000); 
接着是n行数据,每行包含m个整数,表示n行m列的格子对应的幸运值K ( |k|<100 )。 

Output

请对应每组测试数据输出一个整数,表示yifenfei可以得到的最大幸运值。

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

Sample Output

52
public class B_命运 
{    static int C;
     static int n,m;
     static int[][] a=new int[25][1010];
     static int[][] dp=new int[25][1010];
      public static void main(String[] args)
      {
    	  Scanner sc=new Scanner(System.in);
    	  C=sc.nextInt();
    	  while(C!=0)
    	  {
    		  C--;
    		  n=sc.nextInt();
    		  m=sc.nextInt();
    		  for(int i=1;i<=n;i++)
    			  for(int j=1;j<=m;j++)
    			        a[i][j]=sc.nextInt();
    		  for(int i=0;i<=n;i++)         //将所求dp外围数据都初始化为一个很小的负数,这样万一某一个格子上的点数据非常小,不至于被外围的0替换(默认初值为0)
    			  dp[i][0]=-999999;
    		  for(int j=0;j<=m;j++)
    			  dp[0][j]=-999999;  
    		  dp[0][1]=dp[1][0]=0; //dp[1][1]上面和左面的数字要初始化为0;
    		 for(int i=1;i<=n;i++)
    			 for(int j=1;j<=m;j++) //使i和j都从1开始,避免了j-1或者i-1超出数组范围,但是多了外围的数据,(即第一行上面一行,第一列左面一列,需要将其初始化为一个很小的整数,这样才不会干扰数据的选择
    			 {   
    				dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j]); 
    				for(int k=1;k<=m;k++)
    				{   if  (j/k==(double)j/k)  //如果j是k的整数倍的话(k是j的真因子(真因子,包括1,即找除本身以外的其他约数))
    					dp[i][j]=Math.max(dp[i][j], dp[i][j/k]);
    				}
    				dp[i][j]+=a[i][j];
    			 }
    		 System.out.println(dp[n][m]);
          }
      }
}

猜你喜欢

转载自blog.csdn.net/qq_42167059/article/details/84798494