您的位置:首页 > 其它

qscoj 喵哈哈村的打印机游戏(区间dp)

2017-03-22 07:29 211 查看
题目链接:http://www.qscoj.cn/problem/54/

喵哈哈村的打印机游戏

发布时间: 2017年3月21日 20:00 最后更新: 2017年3月21日 20:02 时间限制: 1000ms 内存限制: 128M

描述

喵哈哈村的月亮同学很无聊,于是太阳同学给月亮同学出了个问题,来打发时间:

喵哈哈村有一台奇怪的纸带打印机,每次操作只能先决定一个大写字母(A到Z)在一条纸带上打印这个字母任意长度的连续序列,打印机可以选择在纸带的任意位置开始打印,并且无论纸带上原来是什么内容,都可以用新打印的内容覆盖。那么,对一个目标的字符串序列,请计算在一个空白纸带上最少需要的打印次数。例如,我们要打印的目标串是ABCBA,那么最优的方案是:在空白知道上连续打印5个A:AAAAA,从第二个A开始,连续打印3个B:ABBBA,打印一个C:ABCBA,因此ABCBA的最少打印次数是3次。

输入

每个测试输入包含1个测试用例

输入只有一行,一个长度大于1,小于等于50的目标字符串,字符串中每个字符都是A到Z的大写英文字符。

输出

输出一个整数,

样例输入1 复制

AAAAA

ABCBA

样例输出1

1

3

【思路分析】很典型的区间dp题目(可是窝佷鶸啊,不过这次学会了)。

dp[i][j]代表从第i个字符刷到第j个字符至少要刷多少次。当str[i]==str[k]的时候,dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]) 。

【AC代码】

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define LL long long

char str1[105];
int dp[105][105];//dp[i][j]的含义为从i刷到j至少要刷多少次

int main()
{
while(~scanf("%s",str1))
{
memset(dp,0,sizeof(dp));
int len=strlen(str1);
for(int j=0;j<len;j++)
{
for(int i=j;i>=0;i--)
{
dp[i][j]=dp[i+1][j]+1;
for(int k=i+1;k<=j;k++)//从i到i和j的中间的所有的刷法
{
if(str1[i]==str1[k])//i和k相同的时候,寻找i刷到k的最优解
{
dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);
}
}
}
}
printf("%d\n",dp[0][len-1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp