My issue
Getting wrong answer while putting memset outside of testcase loop in Tetris Problem.
getting ans 3 in every testcase while we caching dp array once.
My code
#include<bits/stdc++.h>
using namespace std;
define int long long
define endl ‘\n’
define m1 1000000007
define m2 998244353
define inf LLONG_MAX/2
define inf2 1e18
define vi vector
define pi pair<int,int>
define mi map<int,int>
define mpi map<pair<int,int>,int>
define vpi vector<pair<int,int>>
define vvi vector<vector>
define vvc vector<vector>
define mc map<char,int>
define st stack
define qu queue
define si set
define sc set
define stp stack<pair<int,int>>
define qup queue<pair<int,int>>
define spi set<pair<int,int>>
define so(a) sort(a.begin(),a.end())
define rso(a) sort(a.rbegin(),a.rend())
define sumall(a) accumulate(a.begin(),a.end(),0LL)
define rev(a) reverse(a.begin(),a.end())
define mx(a) *max_element(a.begin(),a.end())
define mn(a) *min_element(a.begin(),a.end())
define yes cout<<“YES”<<endl
define no cout<<“NO”<<endl
define fi first
define se second
define pb push_back
define fo(n) for(int i=0;i<n;i++)
define rfo(n) for(int i=n-1;i>=0;i–)
define fastio ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL);
int dp[100007][2];
int modexp(int x,int y,int m){
int ans=1;
while(y>0){
if(y&1) ans=(ansx)%m;
y>>=1;
x=(xx)%m;
}
return (ans%m);
}
vector calculateLPS(const string& pattern) {
vectorlps(pattern.size(),0);
int len=0,i=1;
while(i<pattern.size()) {
if(pattern[i]==pattern[len]) len++,lps[i]=len,i++;
else {
if (len!=0) len=lps[len-1];
else lps[i]=0,i++;
}
}
return lps;
}
vector kmpSearch(const string& text, const string& pattern) {
vectorlps=calculateLPS(pattern);
vectorres;
int i=0,j=0;
while (i<text.size()) {
if(pattern[j]==text[i]) i++,j++;
if(j==pattern.size()) res.push_back(i-j),j=lps[j-1];
else if (i<text.size() && pattern[j]!=text[i]) {
if (j!=0) j=lps[j-1];
else i++;
}
}
return res;
}
int sol(int i,int n,int turn){
if(i>=n && turn==1) return 0;
if(i>=n && turn==0) return 1;
if(dp[i][turn]!=-1) return dp[i][turn];
int ans=0;
if((n-i)==1) ans=(ans+sol(i+4,n,turn))%m1;
else if((n-i)==2) ans=(ans+sol(i+1,n,(turn+1)%2)+sol(i+4,n,turn))%m1;
else if((n-i)==3) ans=(ans+sol(i+1,n,(turn+1)%2)+sol(i+2,n,turn)+sol(i+4,n,turn))%m1;
else ans=(ans+sol(i+1,n,(turn+1)%2)+sol(i+2,n,turn)+sol(i+3,n,turn)+sol(i+4,n,turn))%m1;
return dp[i][turn]=ans%m1;
}
signed main(){
memset(dp,-1,sizeof(dp));
fastio
int t;
cin>>t;
while(t–){
int n;
cin>>n;
cout<<sol(0,n,0)<<endl;
}
}