活跃农民
- 积分
- 815
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2012-1-9
- 最后登录
- 1970-1-1
|
本帖最后由 zlxwd 于 2012-4-17 17:47 编辑
动态规划,时间复杂度为O(N^2),空间复杂度为O(N^2)
-
- import java.util.*;
- import java.math.*;
- public class Main {
-
- private static void set(int[][] dp, int i, int j, int val) {
- if (dp[i][j] == -1) {
- dp[i][j] = val;
- }
- else {
- dp[i][j] = Math.min(dp[i][j], val);
- }
- }
-
- public static void main(String[] args) throws Exception {
- Scanner scan = new Scanner(System.in);
- int taskCount = scan.nextInt();
- scan.nextLine();
- for (int taskIndex = 0; taskIndex < taskCount; taskIndex++) {
- char[] arr = scan.nextLine().toCharArray();
- if (arr.length == 0) {
- System.out.println("Input string cannot be empty");
- continue;
- }
- else if (arr.length == 1) {
- System.out.println(arr[0] == '*' ? 1 : 0);
- continue;
- }
- int[][] dp = new int[arr.length][arr.length];
- for (int i = 0; i < dp.length; i++) {
- Arrays.fill(dp[i], -1);
- }
- if (arr[0] == 'x') {
- dp[0][0] = 0;
- }
- else {
- dp[0][0] = 1;
- }
- for (int i = 1; i < arr.length; i++) {
- if (arr[i] == 'x') {
- set(dp, i, 1, dp[i - 1][0]);
- set(dp, i, 0, dp[i - 1][0] + 1);
- }
- else {
- set(dp, i, 1, dp[i - 1][0] + 1);
- set(dp, i, 0, dp[i - 1][0] + 1);
- }
- for (int j = 1; j < arr.length; j++) {
- if (dp[i - 1][j] == -1) {
- continue;
- }
- if (arr[i] == 'x') {
- set(dp, i, j + 1, dp[i - 1][j]);
- set(dp, i, j, dp[i - 1][j] + 1);
- set(dp, i, j - 1, dp[i - 1][j] + 1);
- }
- else {
- set(dp, i, j + 1, dp[i - 1][j] + 1);
- set(dp, i, j, dp[i - 1][j] + 1);
- set(dp, i, j - 1, dp[i - 1][j]);
- }
- }
- }
-
- int result = arr.length;
- for (int i = 0; i < arr.length; i++) {
- if (dp[dp.length - 1][i] == -1) {
- continue;
- }
- result = Math.min(result, dp[dp.length - 1][i] + i);
- }
- System.out.println(result);
- }
- }
- }
复制代码 |
|