HAUT1289 arufuonsusnoufura(区间dp,河南省多校连萌(七))
2017-09-11 13:15
316 查看
题目:
提交: 15 解决: 11
提交 状态
之后T行,每行包括一个字符串s,s中包含小写字母,大写字母和数字,分别代表不同颜色的珠子。s的长度2≤|S|≤200;
提交 状态
思路:
因为是一条项链,所以存储的时候存成2倍,然后状态转移方程是:
如果枚举的两个字符相等:
dp[i][j]=dp[i+1][j-1];
如果不相等:
dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1);
然后遍历长度,找出最小的即可
代码:
#include <cstdio>
#include <cstring>
#include <cctype>
#include <string>
#include <set>
#include <iostream>
#include <stack>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define M 12357
#define ll long long
using namespace std;
char s[500];
int dp[500][500];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
mem(dp,0);
scanf("%s",s+1);
int len=strlen(s+1);
for(int i=1; i<=len; i++)
s[i+len]=s[i];
for(int v=1; v<2*len; v++)
for(int i=1; i+v<2*len; i++)
{
int j=i+v;
if(s[i]==s[j])
dp[i][j]=dp[i+1][j-1];
else
dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1);
}
int minn=inf;
for(int i=1;i<=len;i++)
minn=min(minn,dp[i][i+len-1]);
printf("%d\n",minn);
}
return 0;
}
1289: arufuonsusnoufura
时间限制: 10 秒 内存限制: 128 MB提交: 15 解决: 11
提交 状态
题目描述
爱德华有一天遇到了一个难题,他准备给弟弟送一个项链,不过炼金术师都有这么一个小爱好:喜欢对称,他希望买到的项链也是对称的,不过集市上左右对称的项链早就卖光了。聪明的爱德华准备随便买来一个自己取下几颗珍珠变成对称的。由于取下之后再安回去很麻烦,所以请你计算一下最少取下几枚珠子可以将其变为一个回文串(注意项链是个圈)。输入
输入包含多组,第一行是T<=100,代表数据组数。之后T行,每行包括一个字符串s,s中包含小写字母,大写字母和数字,分别代表不同颜色的珠子。s的长度2≤|S|≤200;
输出
对于每组等式,输出一行,每行1个数字,代表最少取下的珠子个数。样例输入
5arufuonsusnoufuraAbcbasasasasasasastatistic6zc666
样例输出
02141
提示
来源
信息工程大学提交 状态
思路:
因为是一条项链,所以存储的时候存成2倍,然后状态转移方程是:
如果枚举的两个字符相等:
dp[i][j]=dp[i+1][j-1];
如果不相等:
dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1);
然后遍历长度,找出最小的即可
代码:
#include <cstdio>
#include <cstring>
#include <cctype>
#include <string>
#include <set>
#include <iostream>
#include <stack>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define M 12357
#define ll long long
using namespace std;
char s[500];
int dp[500][500];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
mem(dp,0);
scanf("%s",s+1);
int len=strlen(s+1);
for(int i=1; i<=len; i++)
s[i+len]=s[i];
for(int v=1; v<2*len; v++)
for(int i=1; i+v<2*len; i++)
{
int j=i+v;
if(s[i]==s[j])
dp[i][j]=dp[i+1][j-1];
else
dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1);
}
int minn=inf;
for(int i=1;i<=len;i++)
minn=min(minn,dp[i][i+len-1]);
printf("%d\n",minn);
}
return 0;
}
相关文章推荐
- 【hautoj1289】arufuonsusnoufura
- haut 1273: 年终奖金(区间DP)@
- zoj 3469 Food Delivery (区间DP)
- [区间dp] 洛谷 P1220 关路灯
- 简单的区间 dp
- ZOJ - 3469 Food Delivery(区间DP)
- HDU 1003 Max Sum(最大区间和,DP)
- UVALive 6529 Eleven 区间dp
- light oj 1422 Halloween Costumes (区间DP)
- poj 1738 An old Stone Game(区间dp 合并石子问题直线型)
- CF149D 区间dp
- zzuli 2177 Contest - 河南省多校连萌(四)(简单题)
- HDU 4597 Play Game(区间dp)
- pku1141 Brackets Sequence 区间DP
- poj1141(括号匹配-区间dp)
- 区间dp—整数划分
- HAUT 1266 最大子段和(类似DP)(河南工业大学2017校赛)
- POJ 1651 Multiplication Puzzle(区间DP)
- codevs 1154 能量项链(区间dp)
- [BZOJbegin][noip2016十连测第九场]小P的单调区间(dp+bit)