周赛A题

A

Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

Description

By definition palindrome is a string which is not changed when reversed. "MADAM" is a nice example of palindrome. It is an easy job to test whether a given string is a palindrome or not. But it may not be so easy to generate a palindrome.

Here we will make a palindrome generator which will take an input string and return a palindrome. You can easily verify that for a string of length n, no more than (n - 1) characters are required to make it a palindrome. Consider "abcd" and its palindrome "abcdcba" or "abc" and its palindrome"abcba". But life is not so easy for programmers!! We always want optimal cost. And you have to find the minimum number of characters required to make a given string to a palindrome if you are only allowed to insert characters at any position of the string.

Input

Input starts with an integer T (≤ 200), denoting the number of test cases.

Each case contains a string of lowercase letters denoting the string for which we want to generate a palindrome. You may safely assume that the length of the string will be positive and no more than 100.

Output

For each case, print the case number and the minimum number of characters required to make string to a palindrome.

Sample Input

6

abcd

aaaa

abc

aab

abababaabababa

pqrsabcdpqrs

Sample Output

Case 1: 3

Case 2: 0

Case 3: 2

Case 4: 1

Case 5: 0

Case 6: 9

题解:通过插入把给的字符串变为回文串,求出最小操作数。

状态转移:dp[i][j] = min(dp[i+1][j],dp[i][j+1])+1; (s[i]!=s[j])

dp[i][j] = dp[i+1][j-1];  (s[i]==s[j])

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int t,k,dp[1010][1010];
char s[1010];
int main()
{
    cin>>t;
    k=1;
    while (t--)
    {
        cin >> s;
        int len = strlen(s);
        memset(dp,0,sizeof(dp));
        for (int i = len - 1; i >= 0; i--)
            for (int j = i + 1; j < len; j++)
               {
                if (s[i] == s[j])
                    dp[i][j] = dp[i+1][j-1];
                else
                    dp[i][j] = min(dp[i+1][j],dp[i][j-1]) + 1;
               }
       cout<<"Case "<<k++<<": "<<dp[0][len-1]<<endl;
    }
    return 0;
}
时间: 2024-10-19 18:20:34

周赛A题的相关文章

CSDN 轻松周赛赛题:能否被8整除

轻松周赛赛题:能否被8整除 题目详情 给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除. 输入格式: 多组数据,每组数据是一个非负整数.非负整数的位数不超过10000位. 输出格式 每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数.注意: 重排可以让0开头. 答题说明 输入样例   610 122 输出样例   YES NO 解释   第一个数可以变为016 , 160 解题:很水的一道题...思路很简单,1000是能被8整除的,所以一千的倍数都能被

CSDN轻松周赛赛题:能否被8整除

题目意思: 给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除.输入格式:多组数据,每组数据是一个非负整数.非负整数的位数不超过10000位.输出格式每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数.注意: 重排可以让0开头. 题目分析: 判断一个数是否能够被8整除,只需要判断这个数的后三位是否能够整除8即可,对于此题需要模拟判断所有的后三位数重排的六个数是够被8整除,只是注意一位数和两位数的时候需要自己判断. AC代码: #include<cstdi

周赛F题 POJ 1458(最长公共子序列)

F - F Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another

轻松周赛赛题:能否被8整除

练习题链接:http://student.csdn.net/mcs/programming_challenges 给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除. 输入格式: 多组数据,每组数据是一个非负整数.非负整数的位数不超过10000位. 输出格式 每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数.注意: 重排可以让0开头 今天一个小学弟问我这道题怎么做,我直接回答他将数字全排列,验证是否可被8整除,例如123的全排列:123.231.312

ACM训练联盟周赛 C题 Alice和Bob的Nim游戏

题目描述 众所周知,Alice和Bob非常喜欢博弈,而且Alice永远是先手,Bob永远是后手. Alice和Bob面前有3堆石子,Alice和Bob每次轮流拿某堆石子中的若干个石子(不可以是0个),拿到所有石子中最后一个石子的人获胜.这是一个只有3堆石子的Nim游戏. Bob错误的认为,三堆石子的Nim游戏只需要少的两堆的石子数量加起来等于多的那一堆,后手就一定会胜利.所以,Bob把三堆石子的数量分别设为 {k,4k,5k}(k>0). 现在Alice想要知道,在k 小于 2^n 的时候,有多

FJUT2019暑假第二次周赛 A题

# A题 服务器维护 TimeLimit:1500MS MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description Dsc最大的梦想就是有一款属于自己的游戏(不可能的),可以把自己的奇思妙想在虚拟的世界中创造出来,假设Dsc成功了,创造出了一款网游(小作坊的那种),现在为了节省成本,Dsc决定自己维护服务器健康,但总会有没时间的时候. 假设从S分钟开始,E分钟结束[S,E]这段时间Dsc是没有时间的,这时候Dsc需要找人

第三次周赛D题

题意: 多次询问树上两点最短 距离. TLE做法:对每次询问跑一遍最短路,用堆优化迪杰斯特拉的话复杂度大概为\(O(q*(n+m)logm)\). \(100\)分做法: 用一个\(dis\)数组记录根节点\(root\)到每一个节点的距离,那么树上两点\(u,v\)的距离就是\(root\)到\(u\)的距离加上\(root\)到\(v\)的距离减去两倍的\(root\)到\(lca(u,v)\)的距离(可以画下图感性理解...),即 \(ans=dis[u]+dis[v]-2*dis[lca

2019下学期第二次个人周赛—A题

题意: 如题所示,求\(S(u_1,v_1)\)\(\oplus\)\(S(u_2,v_2)\)的最大值. 分析: \(1\).暴力解法:既然\(S(u,v)\)与每个点的祖先有关,那么不难想到一个\(O(n^2)\)的方法计算所有\(S(u,v)\)的值,对每个顶点遍历其祖先暴力计算即可.要算\(S(u_1,v_1)\)\(\oplus\)\(S(u_2,v_2)\)的最大值,可以暴力\(O(p^{2})\)的计算,其中\(p\)表示去重后所有\(S(u,v)\)的数目.那么总复杂度就是\(O

leetcode 第184场周赛第一题(数组中的字符串匹配)

一.函数的运用 1,strstr(a,b); 判断b是否为a的子串,如果是,返回从b的开头开始到a的结尾 如“abcdefgh” “de” 返回“defgh”: 如果不是子串,返回NULL: 2,memcpy(a,b+n,c); 将b串从第n位后的c个字符串复制到a中,返回a串: (注:做完函数后需要添加上b[c] = '\0') 如果吧b+n换成b就是从头开始 将代码换成 memcpy(arr[cnt], words[i], strlen(words[i])+1); 就是直接复制words[i