acm 北大1159题,好心人帮我看看到底错在哪里我找了好长时间都不知道哪错了,可提交就是WA

乐天的猪 2008-02-19 04:56:02
Palindrome
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 14900 Accepted: 5087

Description
A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a program which, given a string, determines the minimal number of characters to be inserted into the string in order to obtain a palindrome.

As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome.


Input
Your program is to read from standard input. The first line contains one integer: the length of the input string N, 3 <= N <= 5000. The second line contains one string with length N. The string is formed from uppercase letters from 'A' to 'Z', lowercase letters from 'a' to 'z' and digits from '0' to '9'. Uppercase and lowercase letters are to be considered distinct.

Output
Your program is to write to standard output. The first line contains one integer, which is the desired minimal number.

Sample Input


5
Ab3bd

Sample Output


2

Source
IOI 2000

我的代码
#include <cstdio>
#include <cstring>
char a[5010];
char res[5010][5010];
int getMin(int i , int j)
{
int min=6000 ,m;
if(res[i][j] != -1)
return res[i][j];
if(i > = j)
return 0;
if(a[i] == a[j])
min = getMin(i+1,j-1);
/* m1=getMin(i+1,j)+1;
if(m1 < min)
min = m1;
m2=getMin(i,j-1)+1;
if(m2 < min)
min = m2;*/
else
{
min = getMin(i+1,j)+1;
m = getMin(i,j-1)+1;
if(m <min)
min=m;
}
res[i][j]=min;
return min;

}
int main()
{
int min;
int n;
while(scanf("%d",&n)!=EOF)
{
memset(res,255,sizeof(res));
scanf("%s",a);
min=getMin(0,n-1);
printf("%d\n",min);
}
return 0;
}
...全文
141 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
乐天的猪 2008-02-19
  • 打赏
  • 举报
回复
Just the point !!!!!!!
呵呵o(∩_∩)o...,谢谢了
我是新手刚用论坛,不太熟,以后一定注意!!呵呵
ltc_mouse 2008-02-19
  • 打赏
  • 举报
回复
题目是求解最少添加多少字符形成对称字符串
先帮lz把代码整理下吧。强烈建议用代码格式贴代码,呵呵

#include <cstdio>
#include <cstring>
char a[5010];
char res[5010][5010];
int getMin(int i, int j)
{
int min=6000, m;
if(res[i][j] != -1)
return res[i][j];
if(i >= j)
return 0;
if(a[i] == a[j])
min = getMin(i+1,j-1);
else
{
min = getMin(i+1,j)+1;
m = getMin(i,j-1)+1;
if(m <min)
min=m;
}

//你确定这里的精度损失不影响结果?即添加的字符个数一定是小于128或255的?
//反例: 0...01...1 (前256个0,后255个1)
res[i][j]=min;

return min;
}
int main()
{
int min;
int n;
while(scanf("%d",&n)!=EOF){
memset(res,255,sizeof(res));
scanf("%s",a);
min=getMin(0,n-1);
printf("%d\n",min);
}
return 0;
}
robot1314 2008-02-19
  • 打赏
  • 举报
回复
LZ讲清楚点,你要做什么,出现了什么样的问题?
不说清楚别人怎么帮你?
用户 昵称 2008-02-19
  • 打赏
  • 举报
回复
眼花啊

70,031

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧