24h購物| | PChome| 登入
2011-09-09 20:07:54| 人氣740| 回應0 | 上一篇 | 下一篇

d273. 11584 - Partitioning by Palindromes

推薦 0 收藏 0 轉貼0 訂閱站台

d273. 11584 - Partitioning by Palindromes

內容 :

迴文的定義就是從左邊寫跟有右邊寫 都一樣 ,例如 'racecar'就是一個迴文,'fastcar'則不是。

 給你一個字串,我們可以找到很多長度不同的迴文字串,任務就是找到把一個字串分成許多小字串,是每一個小字串都是迴文,並找出最少分幾堆。

例如:

        'racecar'已經是一個迴文,所以他只需要分成一堆。

        'fastcar'  沒有一個迴文的部分,所以她必須分成('f', 'a', 's', 't', 'c', 'a', 'r')

         'aaadbccb' 則可以分成 ('aaa', 'd', 'bccb').

 

輸入說明 :

第一行代表有幾組測資,每一行包含1~1000個小寫子母,沒有任何的空白夾在裡面。 

輸出說明 :



對於每一個測試資料,輸出最少可以分成幾堆,使每堆都是迴文。
 

範例輸入 :

3racecarfastcaraaadbccb

範例輸出 :

173

提示 :

出處 :

UVA11584 (管理:nanj0178)



作法 : DP

首先建立 : S[i]~S[j] 是否是一個迴文的字串,
接著, 開始著手 DP
DP[i] = min (DP[j-1] + 1) when s[j] - s[i] 是個迴文
DP[i] 表示 s[0~i] 的最少迴文數量

/**********************************************************************************/
/*  Problem: d273 "11584 - Partitioning by Palindromes" from UVA11584             */
/*  Language: C                                                                   */
/*  Result: AC(0ms, 1.2MB) judge by this@ZeroJudge                                */
/*  Author: morris1028 at 2011-09-09 19:55:23                                     */
/**********************************************************************************/


#include<stdio.h>
#include<string.h>
#define oo 1002
char map[1001][1001];
int Build(char *s) {
    int i, j, k, l = strlen(s);
    memset(map, 0, sizeof(map));
    for(i = 0; i < l; i++) {
        j = i, k = i;
        while(j >= 0 && k < l && s[j] == s[k]) {
            map[j][k] = 1;
            j--, k++;
        }
    }
    for(i = 0; i < l-1; i++) {
        j = i, k = i+1;
        while(j >= 0 && k < l && s[j] == s[k]) {
            map[j][k] = 1;
            j--, k++;
        }
    }
}
int procee_DP(char *s) {
    int DP[1001] = {}, l = strlen(s);
    int i, j;
    DP[0] = 1;
    for(i = 1; i < l; i++) {
        DP[i] = oo;
        for(j = 0; j <= i; j++) {
            if(map[j][i]) {
                if(j != 0)
                    DP[i] = DP[i] < DP[j-1]+1 ? DP[i] : DP[j-1]+1;
                else
                    DP[i] = 1;
            }
        }
    }
    return DP[l-1];
}
main() {
    int t;
    char s[1001];
    scanf("%d", &t);
    while(t--) {
        scanf("%s", s);
        Build(s);
        printf("%d\n", procee_DP(s));
    }
    return 0;
}

台長: Morris
人氣(740) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: UVA |
此分類下一篇:d733. 11329 - Curious Fleas
此分類上一篇:d272. 11583 - Alien DNA

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文