题目链接: http://codeforces.com/contest/835/problem/D

题意: 定义 k 度回文串为左半部分和右半部分为 k - 1 度的回文串 . 给出一个字符串 s, 问 1 ~ s.size() 度回文串的数目分别为多少 .

思路: 预处理 + 记忆化dp

可以先花 O(n^2) 的时间预处理一下所有字串是否为回文串 . 注意预处理时不能直接枚举 l, r, 不然会出现处理 [l, r] 时 [l + 1, r - 1] 并没有先处理的情况 .不过换个思路, 枚举长度和左端点就好了 .

然后可以直接 dfs 出所有字串的回文度, 因为对于回文串其左右部分是一样的, 所以每次 dfs 一半即可,

这里还可以加个记忆优化, 能将复杂度从 O(n * n * log(n)) 降到 O(n * n).

最后注意一下对于度为 k 的串, 其也是度为 1 ~ k - 1 的串 .

代码:

 #include <iostream>
using namespace std; const int MAXN = 5e3 + ;
int vis[MAXN][MAXN];//vis[i][j]记录[i,j]是否为回文串
int dp[MAXN][MAXN];//dp[i][j]记录[i,j]的回文度
int sol[MAXN];//sol[i]记录回文度为i的子串数目 int dfs(int l, int r){
if(l == r) return ;
if(!vis[l][r]) return ;
if(dp[l][r]) return dp[l][r];
int len = r - l + ;
dp[l][r] += dfs(l, l + len / - ) + ;
return dp[l][r];
} int main(void){
ios::sync_with_stdio(false), cin.tie(), cout.tie();
string s;
cin >> s;
int len = s.size();
for(int i = ; i < len; i++){
vis[i][i] = ;
if(i + < len && s[i] == s[i + ]) vis[i][i + ] = ;
}
for(int i = ; i <= len; i++){//i为长度
for(int j = ; j + i - < len; j++){//j为左边界
if(vis[j + ][j + i - ] && s[j] == s[j + i - ]) vis[j][j + i - ] = ;
}
}
for(int i = ; i < len; i++){
for(int j = i; j < len; j++){
sol[dfs(i, j)]++;
}
}
for(int i = len - ; i > ; i--){
sol[i] += sol[i + ];
}
for(int i = ; i <= len; i++){
cout << sol[i] << " ";
}
cout << endl;
return ;
}

cf835(预处理 + 记忆化dp)的更多相关文章

  1. Google Code Jam 2009, Round 1C C. Bribe the Prisoners (记忆化dp)

    Problem In a kingdom there are prison cells (numbered 1 to P) built to form a straight line segment. ...

  2. UVA - 11324 The Largest Clique 强连通缩点+记忆化dp

    题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...

  3. cf779D(记忆化dp)

    题目链接: http://codeforces.com/problemset/problem/799/D 题意: 给出两个矩阵边长 a, b, 和 w, h, 以及一个 c 数组, 可选择 c 数组中 ...

  4. Codeforces1107E Vasya and Binary String 记忆化dp

    Codeforces1107E 记忆化dp E. Vasya and Binary String Description: Vasya has a string \(s\) of length \(n ...

  5. POJ 1088 滑雪(简单的记忆化dp)

    题目 又一道可以称之为dp的题目,虽然看了别人的代码,但是我的代码写的还是很挫,,,,,, //看了题解做的简单的记忆化dp #include<stdio.h> #include<a ...

  6. POJ 1088 滑雪 记忆化DP

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K       Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度 ...

  7. BNU 25593 Prime Time 记忆化dp

    题目链接:点击打开链接 题意: 一个游戏由3个人轮流玩 每局游戏由当中一名玩家选择一个数字作为開始 目的:获得最小的得分 对于当前玩家 O .面对 u 这个数字 则他的操作有: 1. 计分 u +1 ...

  8. [luogu]P1514 引水入城[搜索][记忆化][DP]

    [luogu]P1514 引水入城 引水入城 题目描述在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形 ,如下图所示,其中每个格 ...

  9. 记忆化dp博弈

    题:http://poj.org/problem?id=2068 题意: 有两个队伍A,B,每个队伍有N个人,交叉坐.即是A(1,3,5,7.....)B(2,4,6,8....).告诉你每个mi(1 ...

随机推荐

  1. 洛谷p3369 treap

    这是一个treap裸题,还可以用splay,替罪羊树,线段树等等写 treap是树和堆结合,可以方便的在O(log(n))期望时间内进行以下操作,因此treap又叫做名次树 插入x数 删除x数(若有多 ...

  2. mysql基本语句1

    操作MySQL数据库 向表中插入数据 insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下: insert [into] 表名 [(列名1, 列名2, 列名3, ...)] ...

  3. python遍历并获取对象属性--dir(),__dict__,getattr,setattr

    一.遍历对象的属性: 1.dir(obj) :返回对象的所以属性名称字符串列表(包括属性和方法). for attr in dir(obj): print(attr) 2.obj.__dict__:返 ...

  4. 关于MFC资源句柄、ID和对象

    一.资源.句柄和ID 资源: MFC中的资源,如菜单.对话框.图标.工具条.对话框等,是windows创建的,并占用堆内存.windows在创建这些资源时候会给每个资源分配一个句柄,用来标记这些资源, ...

  5. codeforces 655C C. Enduring Exodus(二分)

    题目链接: C. Enduring Exodus time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  6. tornado 获取参数

    self.get_argument('name') 没有传递name就报400错误了 tornado.web.MissingArgumentError: HTTP 400: Bad Request ( ...

  7. 九省联考2018 D1T1 一双木棋

    Alice和Bob轮流在n*m的棋盘上放棋子 a[i][j]表示Alice放在这的收益,b[i][j]表示Bob放在这的收益 一个地方没有棋子且它的左边上边都有棋子才能放棋子,边界外视为有一圈棋子 n ...

  8. A唐纳德先生和假骰子(华师网络赛)

    Time limit per test: 1.0 seconds Memory limit: 256 megabytes 在进行某些桌游,例如 UNO 或者麻将的时候,常常会需要随机决定从谁开始.骰子 ...

  9. 转 Django根据现有数据库,自动生成models模型文件

    Django引入外部数据库还是比较方便的,步骤如下 : 创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自 ...

  10. 照片Urls

    http://img.my.csdn.net/uploads/201402/16/1392530364_7835.jpg http://img.my.csdn.net/uploads/201402/1 ...