求这行代码优化有多少
查看原帖
求这行代码优化有多少
462558
ziyistudy楼主2024/7/19 20:18

这个代码理论上时间复杂度为 220×n22^{20}\times n^2,会超时(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;
 
}
2024/7/19 20:18
加载中...