• lightoj 1044


    题目链接:http://lightoj.com/volume_showproblem.php?problem=1044

    题意:求给出的字符串最少能分成多少串回文串。

    一般会想到用区间dp暴力3个for但是这里的数据有1000,3个for肯定超时的。

    但是这题只是判断回文串有多少个所以可以先预处理一下[i,j]是不是回文,然后

    就是简单dp了

    for(int i = 1 ; i <= len ; i++) {

                ans[i] = ans[i - 1] + 1;

                for(int j = i - 1 ; j >= 1 ; j--) {

                    if(dp[j][i]) {

                        ans[i] = min(ans[i] , ans[j - 1] + 1);//如果[i,j]是回文那么就是ans[j-1]+1

                    }

                }

            }

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    int dp[1010][1010] , ans[1010];
    char s[1010];
    int main() {
        int t , cnt = 0;
        scanf("%d" , &t);
        while(t--) {
            cnt++;
            scanf("%s" , s + 1);
            int len = strlen(s + 1);
            memset(dp , 0 , sizeof(dp));
            memset(ans , 0 , sizeof(ans));
            for(int k = 0 ; k <= len ; k++) {
                for(int l = 1 ; l <= len && l + k <= len ; l++) {
                    int r = l + k;
                    if(s[l] == s[r]) {
                        if(k == 0 || k == 1) {
                            dp[l][r] = 1;
                        }
                        else {
                            if(dp[l + 1][r - 1]) {
                                dp[l][r] = 1;
                            }
                        }
                    }
                    else {
                        dp[l][r] = 0;
                    }
                }
            }
            for(int i = 1 ; i <= len ; i++) {
                ans[i] = ans[i - 1] + 1;
                for(int j = i - 1 ; j >= 1 ; j--) {
                    if(dp[j][i]) {
                        ans[i] = min(ans[i] , ans[j - 1] + 1);
                    }
                }
            }
            printf("Case %d: %d
    " , cnt , ans[len]);
        }
        return 0;
    }
    
  • 相关阅读:
    创建可管理的对象属性
    解析简单xml文档
    定义类的__slots__属性节省内存的开销
    读写json数据
    读写csv,excel文件数据
    常用的字符串处理方法
    sql中case when 的使用
    对字典的处理
    元组的元素命名
    列表,字典,集合按条件筛选
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6645796.html
Copyright © 2020-2023  润新知