1025 - The Specials Menu

   PDF (English) Statistics Forum
Time Limit: 2 second(s) Memory Limit: 32 MB

Feuzem is an unemployed computer scientist who spends his days working at odd-jobs. While on the job he always manages to find algorithmic problems within mundane aspects of everyday life.

Today, while writing down the specials menu at the restaurant he‘s working at, he felt irritated by the lack of palindromes (strings which stay the same when reversed) on the menu. Feuzem is a big fan of palindromic problems, and started thinking about the number of ways he could remove letters from a particular word so that it would become a palindrome.

Two ways that differ due to order of removing letters are considered the same. And it can also be the case that no letters have to be removed to form a palindrome.

Input

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

Each case contains a single word W (1 ≤ length(W) ≤ 60).

Output

For each case, print the case number and the total number of ways to remove letters from W such that it becomes a palindrome.

Sample Input

Output for Sample Input


3

SALADS

PASTA

YUMMY


Case 1: 15

Case 2: 8

Case 3: 11



PROBLEM SETTER: MUNTASIR MUZAHID CHOWDHURY

SPECIAL THANKS: JANE ALAM JAN (DATASET)

题意:给你一字符串,问你在这字符串里去掉一些字符构成回文串,有多少种方法;

思路:区间dp;

dp[i][j]表示在区间i,j中有多少个回文,然后状态转移方程dp[i][j]=dp[i][j-1]+dp[i+1][j];这里面有重复的这个时候分情况讨论,ans[i]==ans[j]的时候

我们有dp[i][j]=dp[i][j-1]+dp[i+1][j]+1,中间回文和两端构成新的回文,那么中间也就不需要删除了,并且加了问空时,就两端构成回文,当不等时

dp[i][j]=dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1];

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string.h>
 5 #include<stdlib.h>
 6 #include<math.h>
 7 #include<queue>
 8 #include<stack>
 9 #include<vector>
10 using namespace std;
11 typedef long long LL;
12 LL dp[100][100];
13 char ans[100];
14 int main(void)
15 {
16         int i,j,k;
17         int s;
18         scanf("%d",&k);
19         for(s=1; s<=k; s++)
20         {
21                 scanf("%s",ans);
22                 int l=strlen(ans);
23                 memset(dp,0,sizeof(dp));
24                 for(i=0; i<l; i++)
25                 {
26                         for(j=i; j>=0; j--)
27                         {
28                                 if(i==j)dp[j][i]=1;
29                                 else
30                                 {
31                                         if(ans[i]==ans[j])
32                                         {
33                                          dp[j][i]=dp[j][i-1]+dp[j+1][i]+1;
34                                         }
35                                         else
36                                         {
37                                         dp[j][i]= dp[j][i]=dp[j][i-1]+dp[j+1][i]-dp[j+1][i-1];
38                                         }
39                                 }
40                         }
41                 }
42                 printf("Case %d: %lld\n",s,dp[0][l-1]);
43         }
44         return 0;
45 }
时间: 2024-10-11 03:54:49

1025 - The Specials Menu的相关文章

Light OJ 1025 - The Specials Menu(动态规划-区间dp)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1025 题目大意:一串字符, 通过删除其中一些字符, 能够使这串字符变成回文串. 现在给你一串字符,问能够得到多少种不同的回文串: 注意:字符串"abba", 可以得到9串回文串,分别为'a', 'a', 'b', 'b', 'aa', 'bb', 'aba', 'aba', 'abba'. 解题思路:声明dp[i][j]为字符串[i,j]区间中通过删除可以得到不同回

Lightoj 1025 - The Specials Menu

区间dp /* *********************************************** Author :guanjun Created Time :2016/6/30 23:24:27 File Name :1025.cpp ************************************************ */ #include <iostream> #include <cstring> #include <cstdlib> #i

LightOJ1025 The Specials Menu(区间DP)

给一个字符串,问有几种删字符的方式使删后的非空字符串是个回文串. 当然区间DP:dp[i][j]表示子串stri...strj的方案数 感觉不好转移,可能重复算了.我手算了"AAA"这个数据,然后就搞出转移的方式: d[i][j] = ∑ d[i'][j']+1 (i<=i'<=j'<=j 且 str[i]==str[j]) 这个区间DP和经典例题相邻石子合并一样,枚举长度然后枚举起点,这样保证计算过程的拓扑有序.时间复杂度O(strlen4). 1 #include

仿知乎程序 fragment的切换以及toolbar在不同页面下显示的menu不同

       我们在看知乎的时候,你会发现,首页,发现,关注,收藏,草稿这五项,你在点击之后进入到相应页面之后,侧滑菜单还在,你左侧滑一下,这个侧滑菜单还在,而提问,左滑屏幕,这个页面就没有,有点像返回上一页的感觉. 从操作来看,五页面应该是fragment之间的切换,而提问是单独的activity.     我们先从几个fragment入手,这里我们建立五fragment页,选择继承自android.support.v4.app.Fragment,因为这五个页面基本上都一样,就是简单的一个布局

用BadgeView在actionbar menu上显示提醒信息

有时候需要在actionbar menu上显示消息个数,所以可以用BadgeView来实现. 实现方法是获取actionbar menuitem的view,然后创建BadgeView.注意,通常只能在Optionsmenu创建完成之后去获取menuitem的view.我们可以在onCreate方法中延时1秒去处理. <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="ht

Android中ActionBar以及menu的代码设置样式

Android中ActionBar以及menu的代码样式如何设置?今天麦子学院android开发老师主要介绍Android中ActionBar以及menu的代码设置样式,,有需求的朋友可以参阅下 menu有些xml代码 http://schemas.android.com/apk/res/android"> <="" div=""> android:title="查找1" android:orderInCategory

Constructing Roads In JGShining&#39;s Kingdom HDU - 1025

JGShining's kingdom consists of 2n(n is no more than 500,000) small cities which are located in two parallel lines. Half of these cities are rich in resource (we call them rich cities) while the others are short of resource (we call them poor cities)

【TK】1025: 统计硬币

1025: 统计硬币 时间限制: 1 Sec  内存限制: 32 MB提交: 2409  解决: 1107[提交][状态][下载(1元)] 题目描述 假设一堆由1分.2分.5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0). 输入 输入数据第一行有一个正整数T,表示有T组测试数据.接下来的T行,每行有两个数n,m,n和m的含义同上. 输出 对于每组测试数据,请输出可能的组合方式数,每组输出占一行. 样例输入 2 3 5 4 8 样例输出 1 2 1 0

Android标题栏上添加多个Menu按钮

最近项目中碰到要在Android Menu旁边再添加一个按钮,而不是点击menu按钮然后在弹出一些选项. MainActivity代码: public class MainActivity extends Activity { private static final int MENU_CONFIRM = 17; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceS