AcWing 1015. 摘花生
原题链接
简单
作者:
莫得感情的刷题机器
,
2020-08-18 10:06:24
,
所有人可见
,
阅读 336
方法1:for循环dp,遍历所有状态
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
while(t-->0){
int r=sc.nextInt();
int c=sc.nextInt();
int [][] arr=new int[r+1][c+1];
int [][] f=new int[r+1][c+1];
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++){
arr[i][j]=sc.nextInt();
f[i][j]=Math.max(f[i-1][j],f[i][j-1])+arr[i][j];
}
System.out.println(f[r][c]);
}
}
}
方法2:记忆化搜索,只遍历需要的状态。
import java.util.*;
public class Main{
//记忆化搜索一般dp数组和大部分变量都放在这里,方便。
static int[][] f=new int[101][101];
static int[][] arr=new int[101][101];
public static void main(String []args){
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
while(t-->0){
int r=sc.nextInt();
int c=sc.nextInt();
for(int i=1;i<=r;i++) Arrays.fill(f[i],-1);
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
arr[i][j]=sc.nextInt();
System.out.println(dp(r,c));
}
}
public static int dp(int i,int j){
if(i==0||j==0) return 0;
if(f[i][j]!=-1) return f[i][j];
f[i][j]=Math.max(dp(i-1,j),dp(i,j-1))+arr[i][j];
return f[i][j];
}
}