f[n]
=0,n=0
else =f[n-1],s[n]=0
else =2^n-1,s[i]=0,1<=i<=n-1
else =f[k-1]+2^n-2^k,k为1到n-1中最后一个一位数
#include<iostream> #include<cstring> #include<cstdio> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define dwn(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; const int maxn=1010; int maxx(int a,int b){return a<b?b:a;} struct Bn{ int s[maxn],lon; Bn(){ memset(s,0,sizeof(s)); lon=0; } void clear(){ while(lon&&s[lon]==0)lon--; } Bn operator + (const Bn &b)const{ Bn Ans; Ans.lon=maxx(lon,b.lon); rep(i,0,Ans.lon){ Ans.s[i]+=s[i]+b.s[i]; if(Ans.s[i]>=10) Ans.s[i+1]++, Ans.s[i]-=10; } Ans.lon++; Ans.clear(); return Ans; } Bn operator - ( Bn &b)const{ Bn Ans=*this; rep(i,0,Ans.lon){ Ans.s[i]-=b.s[i]; if(Ans.s[i]<0) Ans.s[i+1]--, Ans.s[i]+=10; } Ans.clear(); return Ans; } void coutt(){ clear(); dwn(i,lon,0)printf("%d",s[i]); } }f[maxn],mi2[maxn]; int n,a[maxn]; int main(){ scanf("%d",&n); rep(i,1,n)scanf("%d",&a[i]); mi2[0].s[0]=1; rep(i,1,n){ mi2[i]=mi2[i-1]+mi2[i-1]; if(a[i]==0){ f[i]=f[i-1]; continue; } int re=-1; dwn(j,i-1,1) if(a[j]){re=j;break;} if(re==-1){ f[i]=mi2[i]; f[i].s[0]--; continue; } f[i]=f[re-1]+mi2[i]-mi2[re]; } f[n].coutt(); return 0; }