您的位置:首页 > 其它

数字哑谜和回文

2014-09-14 21:53 106 查看
1.人过大佛寺*我=寺佛大过人

#include<iostream>
using namespace std;
#define true 1
#define false 0

int main()
{
bool flag;
bool IsUsed[10];
int number,revert_number,t,v;
for(number=10234;number<=98765;number++)
{
flag=true;
memset(IsUsed,0,sizeof(IsUsed));
t=number;
revert_number=0;
for(int i=0;i<5;i++)
{
v=t%10;
if(IsUsed[v])
{
flag=false;
break;
}
else IsUsed[v]=1;
revert_number=revert_number*10+v;
t/=10;
}
if(flag&&(revert_number%number==0))
{
v=revert_number/number;
if(v<10&&!IsUsed[v])cout<<number<<'*'<<v<<'='<<revert_number<<endl;
}
}
return 0;
}


1.最长回文子串

2.最长回文子序列

int LPS(string s)
{
int n=s.size();
vector<vector<int> > dp(n,vector<int>(n,0));
for(int i=n-1;i>=0;--i)
{
dp[i][i]=1;
for(int j=i+1;j<n;++j)
{
if(s[i]==s[j])dp[i][j]=dp[i+1][j-1]+2;
else dp[i][j]=max(dp[i][j-1],dp[i+1][j]);
}
}
return dp[0][n-1];
}

//滚动数组
int LPS(string s)
{
int n=s.size();
vector<vector<int> > dp(2,vector<int>(n,0));
int now=0;
for(int i=n-1;i>=0;--i)
{
dp[i][i]=1;
for(int j=i+1;j<n;++j)
{
if(s[i]==s[j])dp[now][j]=dp[1-now][j-1]+2;
else dp[now][j]=max(dp[now][j-1],dp[1-now][j]);
}
now=1-now;
}
return n&1?dp[0][n-1]:dp[1][n-1];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: