【题目描述】
AcWing 1015. 摘花生
【错误代码】
使用贪心策略并不能得到全局最优,注意在 数字三角形那道题是对每种策略都进行了求解。
使用如下代码并不能AC,会发现得到的答案数目是小于等于正确数的。
import java.io.*;
class Main{
static int M = 110, N = 110;
public static int solve(int q[][],int m, int n){
int i = m, j =n;
int ans = q[m][n];
while( i != 1 && j != 1){
if(i - 1 <=0){
ans += q[i][j - 1];
j = j -1;
}else if( j - 1 <=0){
ans += q[i - 1][j];
i = i - 1;
}else if(q[i - 1][j] >= q[i][j - 1]){
ans += q[i - 1][j];
i = i - 1;
}else{
ans += q[i][j - 1];
j = j - 1;
}
}
ans += q[1][1];
return ans;
}
public static void main(String args[]) throws Exception{
BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));
BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(bf.readLine());
while(T-- > 0){
String str[] = bf.readLine().split(" ");
int R = Integer.parseInt(str[0]), C = Integer.parseInt(str[1]);
int q[][] = new int[ M ][ N ];
for(int i = 1; i <= R; i++){
String s[] = bf.readLine().split(" ");
for(int j = 1; j <= C; j++) q[i][j] = Integer.parseInt(s[ j -1 ]);
}
int ans = solve(q, R, C);
log.write(ans+"");
log.write("\n");
}
log.flush();
log.close();
bf.close();
}
}
【正解】
import java.io.*;
class Main{
static int M = 110, N = 110;
public static void main(String args[]) throws Exception{
BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));
BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(bf.readLine());
while(T-- > 0){
String str[] = bf.readLine().split(" ");
int R = Integer.parseInt(str[0]), C = Integer.parseInt(str[1]);
int q[][] = new int[ M ][ N ];
for(int i = 1; i <= R; i++){
String s[] = bf.readLine().split(" ");
for(int j = 1; j <= C; j++) q[i][j] = Integer.parseInt(s[ j -1 ]);
}
int f[][] = new int[ M ][ N];
for(int i = 1; i <= R; i++)
for(int j = 1; j <= C; j++)
f[i][j] = Math.max(f[i - 1][j], f[i][j - 1]) + q[i][j];
log.write(f[R][C]+"");
log.write("\n");
}
log.flush();
log.close();
bf.close();
}
}