zoukankan      html  css  js  c++  java
  • 随手练——Uva-11584 划分成回文串(区间DP)

    思路:dp[i]代表到第i位的最小值,枚举它的前几位,求出最小值。

    转移方程:dp[ i ] = min(dp[ i ], dp[ j - 1 ] + 1 ) ;

    本来觉得,代码加深部分可以提前break,其实不行,有些特例,比如:oioooo

    oio ooo是最少的,两个;提前break的话,会判断成oi oooo,三个。

    最开始用string写的,一直超时,改成char数组才过的了。

    #include <iostream>
    #include <string.h>
    #include <algorithm>
    #include <string>
    using namespace std;
    
    char arr[1010];
    int dp[1010];
    int res = 0;
    
    bool check(int i,int j) {
        while (i < j) {
            if (arr[i] != arr[j])return false;
            i++, j--;
        }
        return true;
    }
    
    int main() {
        int t;
        scanf("%d", &t);
        while (t--) {
            scanf("%s", arr);
            memset(dp, 0, sizeof(dp));
            dp[0] = 0;
            for (int i = 1; i <= strlen(arr); i++) {
                dp[i] = i;
                for (int j = 1; j <= i; j++) {
                    if (check(j - 1, i - 1)) {
                        dp[i] = min(dp[i], dp[j - 1] + 1);
                    }
                }
            }
    
            printf("%d
    ", dp[strlen(arr)]);
            }
        return 0;
    }
  • 相关阅读:
    【大胃王】2013暴食女王巅峰战(安吉拉x三宅x正司x木下)熟肉+高能
    破解 CrackMe#1 [UBC] by bRaINbuSY
    栈实现符号平衡检测
    简单的栈
    数独算法
    win32绘图基础
    Win32基础知识整理
    Win32最简单的程序
    初学layer
    android 虚线
  • 原文地址:https://www.cnblogs.com/czc1999/p/10422221.html
Copyright © 2011-2022 走看看