#include <bits/stdc++.h> using namespace std; const long long inf=4000000000000000000LL; int n,i,k,b[77]; long long m,a[202],s[202],f[202][202][77][2]; bool u[202][202][77][2]; long long F(int l, int r, int k, int ls) { if (k<0) return (l==r)?0:-inf; if (u[l][r][k][ls]) return f[l][r][k][ls]; u[l][r][k][ls]=true; long long& res=f[l][r][k][ls]; if (r-l+1>(1LL<<(k+1))) return res=-inf; res=F(l,r,k-1,int(ls==1 || b[k]==1)); if (ls==1 || b[k]==1) { long long cur=F(l,r,k-1,ls); if (cur>-inf) res=max(res,cur+s[r]-s[l-1]); for (int j=l; j<r; j++) { cur=F(l,j,k-1,1); if (cur>-inf) { long long rgh=F(j+1,r,k-1,ls); if (rgh>-inf) res=max(res,cur+rgh+s[r]-s[j]); } } } //printf("%d %d %d %d = %I64d\n",l,r,k,ls,res); return res; } int main() { cin>>n>>m; for (i=1; i<=n; i++) { cin>>a[i]; s[i]=s[i-1]+a[i]; } for (k=0; m>0; m/=2, k++) b[k]=(m&1); cout<<F(1,n,k-1,0); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include <bits/stdc++.h> using namespace std; const long long inf=4000000000000000000LL; int n,i,k,b[77]; long long m,a[202],s[202],f[202][202][77][2]; bool u[202][202][77][2]; long long F(int l, int r, int k, int ls) { if (k<0) return (l==r)?0:-inf; if (u[l][r][k][ls]) return f[l][r][k][ls]; u[l][r][k][ls]=true; long long& res=f[l][r][k][ls]; if (r-l+1>(1LL<<(k+1))) return res=-inf; res=F(l,r,k-1,int(ls==1 || b[k]==1)); if (ls==1 || b[k]==1) { long long cur=F(l,r,k-1,ls); if (cur>-inf) res=max(res,cur+s[r]-s[l-1]); for (int j=l; j<r; j++) { cur=F(l,j,k-1,1); if (cur>-inf) { long long rgh=F(j+1,r,k-1,ls); if (rgh>-inf) res=max(res,cur+rgh+s[r]-s[j]); } } } //printf("%d %d %d %d = %I64d\n",l,r,k,ls,res); return res; } int main() { cin>>n>>m; for (i=1; i<=n; i++) { cin>>a[i]; s[i]=s[i-1]+a[i]; } for (k=0; m>0; m/=2, k++) b[k]=(m&1); cout<<F(1,n,k-1,0); return 0; } |