为了更好的阅读体检,可以查看我的算法学习网
本题在线评测链接:P1215
题目内容
塔子哥是一个喜欢拼图的小男孩,有一天,他收到了一份神秘的礼物。打开后,他发现里面是一个由英文字母组成的二维矩阵,每个字母都是一块拼图。
塔子哥觉得很好奇,就开始拼接这个矩阵。他发现,这个矩阵有一个特殊的规则,就是他只能从左上角开始,每次向右或向下移动一步,然后收集拼图上的英文字母。而且,每个字母都有一个分数,大写字母的分数比小写字母的分数高,所以塔子哥很想收集大写字母。
塔子哥想知道,他最多可以收集多少个大写字母。你能帮帮他吗?
输入描述
第一行输入两个正整数 n n n 和 m m m ,代表矩阵的行数和列数。
接下来的 n n n 行,每行输入一个长度为 m m m 的、仅包含大写和小写字母的字符串。
1 ≤ n , m ≤ 1000 1 \le n, m \le 1000 1≤n,m≤1000
输出描述
一个整数,代表塔子哥最多可以收集到的大写字母。
样例
输入
5 5
AaBbb
bAaBa
CacAc
AbcBC
cbAbA
输出
7
思路:简单动态规划
原题:https://leetcode.cn/problems/unique-paths/
这里我们改一下转移即可; d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) + ( a [ i ] [ j ] 是大写字母 ) dp[i][j] = max(dp[i - 1][j] , dp[i][j - 1]) + (a[i][j]是大写字母) dp[i][j]=max(dp[i−1][j],dp[i][j−1])+(a[i][j]是大写字母)
代码
java代码
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class Main {
static int res = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int [][] dp = new int[n + 1][m + 1];
for (int i = 1 ; i <= n ; i++){
String a = sc.next();
for (int j = 1 ; j <= m ; j++){
int d = 0;
if ('A' <= a.charAt(j - 1) && a.charAt(j - 1) <= 'Z') d = 1;
dp[i][j] = Math.max(dp[i - 1][j] , dp[i][j - 1]) + d;
}
}
System.out.println(dp[n][m]);
}
}