题目来源:码蹄集
题目描述:
Java代码实现:
import java.util.Scanner;
public class Main {
public static int max(int a, int b) {
return a > b ? a : b;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String order = scanner.next();
int n = scanner.nextInt();
int len = order.length();
order = " " + order;
int[][][] dp = new int[len + 1][n + 1][2];
for (int i = 0; i <= len; i++) {
for (int j = 0; j <= n; j++) {
dp[i][j][0] = dp[i][j][1] = -1000000000;
}
}
dp[0][0][0] = 0;
dp[0][0][1] = 0;
for (int i = 1; i <= len; i++) {
for (int j = 0; j <= n; j++) {
for (int k = 0; k <= j; k++) {
if (order.charAt(i) == 'F') {
if (k % 2 == 1) {
dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][0]);
dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][0]);
} else {
dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][0] + 1);
dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][1] - 1);
}
} else {
if (k % 2 == 1) {
dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][0] + 1);
dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][1] - 1);
} else {
dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][1]);
dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][0]);
}
}
}
}
}
System.out.println(max(dp[len][n][0], dp[len][n][1]));
}
}
C++代码实现:
参考链接:https://blog.csdn.net/m0_54754302/article/details/128209412
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int dp[101][51][2];
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
char order[105];
int n;
scanf("%s", order);
scanf("%d", &n);
int len = strlen(order);
for (int i = len - 1; i >= 0; i--)
order[i + 1] = order[i];
order[0] = ' ';
for (int i = 0; i <= len; i++)
for (int j = 0; j <= n; j++)
dp[i][j][0] = dp[i][j][1] = -1000000000;
dp[0][0][0] = 0;
dp[0][0][1] = 0;
for (int i = 1; i <= len; i++)
for (int j = 0; j <= n; j++)
for (int k = 0; k <= j; k++)
if (order[i] == 'F') {
if (k % 2 == 1) {
dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][0]);
dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][0]);
} else {
dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][0] + 1);
dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][1] - 1);
}
} else {
if (k % 2 == 1) {
dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][0] + 1);
dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][1] - 1);
} else {
dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][1]);
dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][0]);
}
}
printf("%d\n", max(dp[len][n][0], dp[len][n][1]));
return 0;
}
代码提交测试结果:
附B站老师讲解链接,可供参考:https://www.bilibili.com/video/BV1ck4y1s7s8/?t=998.5