数字三角形
import java.util.*;
import java.math.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] w = new int[n][n];
int[][] f = new int[n + 1][n + 1];
for (int i = 0; i < n; i++){
for (int j = 0; j <= i; j++){
w[i][j] = sc.nextInt();
}
}
for (int i = n - 1; i >= 0; i--){
for (int j = 0; j <= i; j++){
f[i][j] = Math.max(f[i + 1][j], f[i+ 1][j+1]) + w[i][j];
}
}
System.out.println(f[0][0]);
}
}
摘花生
import java.util.*;
import java.math.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t-- > 0){
int n = sc.nextInt();
int m = sc.nextInt();
int[][] w = new int[n + 1][m + 1];
int[][] dp = new int[n+ 1][m + 1];
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++){
w[i][j] = sc.nextInt();
dp[i][j] = Math.max(dp[i-1][j], dp[i][j -1]) + w[i][j];
}
}
System.out.println(dp[n][m]);
}
}
}
最低通行费
import java.util.*;
import java.math.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] w = new int[n + 1][n + 1];
int[][] dp = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
w[i][j] = sc.nextInt();
if (i == 1){
dp[i][j] = dp[i][j - 1] + w[i][j];
}
else if (j == 1){
dp[i][j] = dp[i - 1][j] + w[i][j];
}
else{
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + w[i][j];
}
}
}
System.out.println(dp[n][n]);
}
}
方格取数
import java.util.*;
import java.math.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] w = new int[n + 1][n + 1];
int[][][] dp = new int [n + n +1][n + 1][n + 1];
while (true){
int x = sc.nextInt();
int y = sc.nextInt();
int z = sc.nextInt();
if (x == 0 && y == 0 && z == 0){
break;
}
w[x][y] = z;
}
for (int k = 2; k <= n + n; k++){
for (int i1 = 1; i1 <= n; i1 ++){
for (int i2 = 1; i2 <= n; i2++){
int j1 = k - i1, j2 = k - i2;
if (j1 > 0 && j1 <= n && j2 > 0 && j2 <= n){
int t = w[i1][j1];
if (i1 != i2){
t+= w[i2][j2];
}
dp[k][i1][i2] = Math.max(dp[k][i1][i2], dp[k - 1][i1][i2]+t);
dp[k][i1][i2] = Math.max(dp[k][i1][i2], dp[k-1][i1-1][i2]+t);
dp[k][i1][i2] = Math.max(dp[k][i1][i2], dp[k - 1][i1][i2-1]+t);
dp[k][i1][i2] = Math.max(dp[k][i1][i2], dp[k - 1][i1-1][i2-1] + t);
}}
}
}
System.out.println(dp[n+n][n][n]);
}
}
传纸条
题目-275.传纸条
与上题不同,本题则是一个人从左上角到右下角,另一个人从右下角到左上角。但是,可以将从右下角到左上角看做是从左上角到右下角,因此,本题与上题思路相同。
import java.util.*;
import java.math.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] w = new int[n + 1][m + 1];
int[][][] dp = new int[n + m + 1][n + 1][n+ 1];
for (int i =1 ;i <=n;i++){
for (int j = 1; j <= m; j++){
w[i][j] = sc.nextInt();
}
}
for (int k = 2; k <= n+m; k++){
for (int i1 = 1; i1 <= n; i1++){
for (int i2 = 1; i2 <= n; i2 ++){
int j1 = k - i1, j2 = k - i2;
if (j1 > 0 && j1 <= m && j2 > 0 && j2 <= m){
int t = w[i1][j1];
if (i1 != i2){
t += w[i2][j2];
}
dp[k][i1][i2] = Math.max(dp[k][i1][i2], dp[k - 1][i1][i2] + t);
dp[k][i1][i2] = Math.max(dp[k][i1][i2], dp[k - 1][i1- 1][i2] + t);
dp[k][i1][i2] = Math.max(dp[k][i1][i2], dp[k-1][i1][i2-1] + t);
dp[k][i1][i2] = Math.max(dp[k][i1][i2], dp[k - 1][i1- 1][i2-1]+ t);
}
}
}
}
System.out.println(dp[n + m][n][n]);
}
}