解决方案:SPOJ:DSUBSEQ

时间:2018-06-02 12:13:38

标签: c++ dynamic-programming

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

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

输出:

  • 4
  • 128
  • 496

但我得到了:错误的答案#1

这种语言是c ++。我是动态编程的新手。

1 个答案:

答案 0 :(得分:0)

输入也包含较低的测试用例 将每个字符转换为大写

是一件好事

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