lightoj 1033

来源:互联网 发布:如何查看淘宝等级 编辑:程序博客网 时间:2024/04/19 01:39

题面

题意

给一个字符串,问最少加入多少个字符可以使它变为回文串.

方法

可以从最左端和最右端开始比较,从两端入手(两端相同),dp[i][j]表示i到j这一段的最少次数,dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1,若两端相等则可以将结果与dp[i+1][j-i]比较.
主要是通过缩小范围来一步一步地推出答案

代码

#include<bits/stdc++.h>using namespace std;int T,TT,dp[110][110];char a[110];int dfs(int u,int v){    if(v<=u) return 0;    if(dp[u][v]!=-1) return dp[u][v];    int res;    res=min(dfs(u+1,v),dfs(u,v-1))+1;    if(a[u]==a[v]) res=min(res,dfs(u+1,v-1));    dp[u][v]=res;    return res;}int main(){    int i,j;    cin>>T;    TT=T;    while(T--)    {        scanf("%s",a+1);        memset(dp,-1,sizeof(dp));        printf("Case %d: %d\n",TT-T,dfs(1,strlen(a+1)));    }}
原创粉丝点击