我的代码对以下问题给出了错误的答案。我尝试了很多测试用例,但无法找到错误。
http://www.spoj.com/problems/DSUBSEQ/
# include<bits/stdc++.h>
# define lli long long int
# define pb push_back
# define loop(i,a,b) for(int i=a;i<b;i++)
# define loopl(i,a,b) for(lli i=a;i<b;i++)
# define MAXN 1000
#define INF 1000000000
# define mod 1000000007
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
string s;
cin>>s;
int n=s.length();
int visited[26],dp[n+1];
memset(visited,-1,26);
loop(i,0,26) visited[i]=-1;
dp[0]=1;
loop(i,1,n+1)
{
dp[i]=2*dp[i-1];
if(visited[s[i-1]-'A']!=-1) dp[i]=(dp[i]%mod-dp[visited[s[i-1]-'A']]%mod + mod)%mod ;
visited[s[i-1]-'A'] = i-1 ;
}
cout<<dp[n]<<endl;
}
}
示例测试案例:
INPUT:
3
AAA
ABCDEFG
CODECRAFT
输出:
但我得到了:错误的答案#1
这种语言是c ++。我是动态编程的新手。
答案 0 :(得分:0)
输入也包含较低的测试用例 将每个字符转换为大写
是一件好事更新:你做错的另一件事是不在这一行中使用mod dp[i]=2*dp[i-1]
想象一下一个测试,那里有26个字母,在这种情况下ans将会2 ^ 26肯定会溢出
设为dp[i]=(2*dp[i-1])%mod