这个代码理论上时间复杂度为 220×n2,会超时(TLE on 73)。但如果加上注释代码,就跑的飞快。求为什么?这行优化到底有多少
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define pb push_back
#define eb emplace_back
//#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
const ll MOD=1e9+7;
// head
const int N=80,M=20;
int a[N];
int dp[N][(1<<M)+10];
signed main()
{
cin.tie(nullptr);
ios::sync_with_stdio(false);
int n;cin>>n;
string s;cin>>s;
for(int i=1;i<=n;i++) a[i]=s[i-1]-'0';
for(int i=1;i<=n;i++){
dp[i][0]=1;
for(int j=0;j<(1<<M);j++){
if(!dp[i][j]) continue; //这里
int now=0;
for(int k=i;k<=n;k++){
now=now*2+a[k];
if(now>M) break;
if(!now) continue;
(dp[k+1][j|(1<<(now-1))]+=dp[i][j])%=MOD;
}
}
}
int ans=0;
for(int i=1;i<=n+1;i++){
for(int j=1;j<=M;j++){
(ans+=dp[i][(1<<j)-1])%=MOD;
}
}
cout<<ans<<endl;
}