zoukankan      html  css  js  c++  java
  • uva 10453

    题目链接:10453 - Make Palindrome


    题目大意:给出一个字符串,通过插入字符使得原字符串变成一个回文串,要求插入的字符个数最小,并且输出最后生成的回文串。


    解题思路:和uva 10739的做法相似,只是本题只能插入字符,所以只要在考虑子问题的同时记录住最优的选择就可以了。


    #include <stdio.h>
    #include <string.h>
    const int N = 1005;
    
    int n, dp[N][N], rec[N][N];
    char str[N];
    
    int solve() {
        n = strlen(str);
        memset(dp, 0, sizeof(dp));
        memset(rec, 0, sizeof(rec));
        
        for (int i = n - 1; i >= 0; i--) {
    	for (int j = i + 1; j < n; j++) {
    	    if (str[i] == str[j])
    		dp[i][j] = dp[i + 1][j - 1];
    	    else {
    		if (dp[i + 1][j] > dp[i][j - 1]) {
    		    dp[i][j] = dp[i][j - 1] + 1;
    		    rec[i][j] = 1;
    		}
    		else {
    		    dp[i][j] = dp[i + 1][j] + 1;
    		    rec[i][j] = -1;
    		}
    	    }
    	}
        }
        return dp[0][n - 1];
    }
    
    void print(int a, int b) {
        if (a > b)	return;
    //    printf("%d!
    ", rec[a][b]);
        if (a == b)
    	printf("%c", str[a]);
        else if (rec[a][b] == 0) {
    	printf("%c", str[a]);
    	print(a + 1, b - 1);
    	printf("%c", str[a]);
        }
        else if (rec[a][b] == 1) {
    	printf("%c", str[b]);
    	print(a, b - 1);
    	printf("%c", str[b]);
        }
        else {
    	printf("%c", str[a]);
    	print(a + 1, b);
    	printf("%c", str[a]);
        }
    }
    
    int main() {
        while (gets(str)) {
    	printf("%d ", solve());
    	print(0, n - 1);
    	printf("
    ");
        }
        return 0;
    }
    


  • 相关阅读:
    1.2 进位运算 & 数据类型 & 变量
    phpcms 下载数统计
    mysql 手动安装
    php 位运算权限问题
    php foreach详解
    文字溢出问题
    webstrom 基本设置
    DEDE利用Ajax实现调用当前登录会员的信息简要说明
    windows服务器
    DedeCms密码解密
  • 原文地址:https://www.cnblogs.com/pangblog/p/3328959.html
Copyright © 2011-2022 走看看