C++ 解:SPOJ:DSUBSEQ

C++ 解:SPOJ:DSUBSEQ,c++,dynamic-programming,C++,Dynamic Programming,我的代码对以下问题给出了错误的答案。我尝试了很多测试用例,但都没有找到错误 #包括 #定义lli长整型 #定义pb推回 #为(int i=a;it; 而(t--) { 字符串s; cin>>s; int n=s.长度(); int[26],dp[n+1]; memset(已访问,-1,26); 循环(i,0,26)访问[i]=-1; dp[0]=1; 循环(i,1,n+1) { dp[i]=2*dp[i-1]; 如果(访问[s[i-1]-'A']!=-1)dp[i]=(dp[i]%mod dp

我的代码对以下问题给出了错误的答案。我尝试了很多测试用例,但都没有找到错误

#包括
#定义lli长整型
#定义pb推回
#为(int i=a;it;
而(t--)
{
字符串s;
cin>>s;
int n=s.长度();
int[26],dp[n+1];
memset(已访问,-1,26);
循环(i,0,26)访问[i]=-1;
dp[0]=1;
循环(i,1,n+1)
{
dp[i]=2*dp[i-1];
如果(访问[s[i-1]-'A']!=-1)dp[i]=(dp[i]%mod dp[s[i-1]-'A']]%mod+mod)%mod;
访问[s[i-1]-'A']=i-1;
}

cout输入还包含较低的测试用例。
将每个字符转换为大写是件好事

更新:你做错的另一件事是没有在这行中使用mod
dp[i]=2*dp[i-1]
想象一个测试,其中有不同的26个字母,在这种情况下,ans将2^26肯定会溢出
使其
dp[i]=(2*dp[i-1])%mod

在问题中,它只包含大写字母。有时它们会偏离约束,而不注意小写字母,只注意dp[i]的mod每一步都解决了我的问题。Ohk。我在SPOJ上遇到了一个问题,它偏离了它的约束,所以我想这里可能也是这样。你知道会产生错误结果的输入情况吗?如果是这样,你应该尝试使用调试器或其他更简单的方法(如调试打印语句)调试代码。这不是你最后的唯一一次如果代码中有bug,学习调试程序将比让别人帮你找到bug帮助更多。不要使用
#include
和其他宏垃圾。永远不要。如果你担心键入一些
#include
行或for循环之类的东西,你需要提高键入速度。糟糕的“节省时间”实践常常使程序更难调试。
# 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;
   }

}