import java.util.Scanner;
public class Main
{
private int r; //r代表多少行
private int l; //l代表多少列
private int[][] a;
private int max;
Main( int r,int l )
{
this.r = r;
this.l = l;
this.a = new int[r][l];
this.max = 0;
}
public void setA( int row,int line,int b )
{
this.a[row][line] = b;
}
public void getM()
{
int[][] b = new int[this.r][this.l];
b[0][0] = this.a[0][0];
for( int i=1;i<this.l;i++ )
b[0][i] = b[0][i-1] + this.a[0][i];
for( int i=1;i<this.r;i++ )
b[i][0] = b[i-1][0] + this.a[i][0];
for( int i=1;i<this.r;i++ )
{
for( int j=1;j<this.l;j++ )
{
b[i][j] = b[i-1][j-1];
if( b[i-1][j]>b[i][j] )
b[i][j] = b[i-1][j];
if( b[i][j-1]>b[i][j] )
b[i][j] = b[i][j-1];
b[i][j] += this.a[i][j];
}
}
this.max = b[this.r-1][this.l-1];
}
public void prM( int i )
{
i++;
System.out.println( "Scenario #" + i + ":" );
System.out.println( this.max );
System.out.println();
}
public static void main(String[] args)
{
int num = 0;
Scanner s = new Scanner(System.in);
num = s.nextInt();
int r;
int l;
for( int i=0;i<num;i++ )
{
r = s.nextInt();
l = s.nextInt();
Main m = new Main(r,l);
int row = 0;
int line = 0;
for( row=0;row<r;row++)
{
for( line=0;line<l;line++ )
{
int b = s.nextInt();
m.setA( row,line,b );
}
}
m.getM();
m.prM( i );
}
}
}
刚开始时,直接递归,发现,超时了。然后,一直想不出DP怎么做,所以,就上网看了一下大神的代码。然后,参考大神的代码,写了出来。
先让b[0][0] = a[0][0], 那么,在第一列,最大的数只能为: b[i][0] = b[i-1][0] + a[i][0]( 0<i<r )
在第一行,最大的数为: b[0][i] = b[0][i-1]+a[0][i]( 0<i<L )
经过上面那么搞,初始化的矩阵就搞定了。
然后,到第k个数,即a[i][j]时,要得到的最大的数值为: Max{ b[i-1][j]+a[i][j], b[i][j-1]+a[i][j],b[i-1][j-1]+a[i][j] }
第一次用动态规划写,很有感触。