#include<bits/stdc++.h> using namespace std; long long t[205],m,n,dp[2][205]; long long zrob(long long poczn,long long konn,long long poczm,long long konm) { long long wynik=-LONG_MAX; if(konn-poczn+1==konm-poczm+1) { wynik=0; for(long long i=0;i<konn-poczn+1;i++) { wynik+=t[poczn+i]*(__builtin_popcount(poczm+i)); } return wynik; } else if (konn-poczn+1>konm-poczm+1)return -LONG_MAX/2; for(long long i=poczn;i<konn;i++) { wynik=max(wynik,zrob(poczn,i,poczm,(poczm+konm)/2)+zrob(i+1,konn,(poczm+konm)/2+1,konm)); } wynik=max(wynik,zrob(poczn,konn,poczm,(poczm+konm)/2)); wynik=max(wynik,zrob(poczn,konn,(poczm+konm)/2+1,konm)); //cout<<poczn<<' '<<konn<<' '<<poczm<<' '<<konm<<' '<<wynik<<'\n'; return wynik; } int main() { ios_base::sync_with_stdio(0); cin>>n>>m; for(int i=1;i<=n;i++) { cin>>t[i]; } for(int i=2;i<=n;i++)dp[0][i]=-(1e18); for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { dp[i&1][j]=max(dp[(i&1)^1][j],dp[(i&1)^1][j-1]+t[j]*(__builtin_popcount(i))); if(i+1<j)dp[i&1][j]=-(1e18); //cout<<dp[i][j]<<'\n'; } //if(dp[i][n]>dp[i-1][n])cout<<__builtin_popcount(i)<<'\n'; } /*if(dp[m&1][n]==zrob(1,n,0,m))cout<<"TAK"<<'\n'; else cout<<"NIE"<<'\n';*/ cout<<dp[m&1][n]<<'\n'; //cout<<zrob(1,n,0,m); }
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 38 39 40 41 42 43 44 45 46 47 48 49 | #include<bits/stdc++.h> using namespace std; long long t[205],m,n,dp[2][205]; long long zrob(long long poczn,long long konn,long long poczm,long long konm) { long long wynik=-LONG_MAX; if(konn-poczn+1==konm-poczm+1) { wynik=0; for(long long i=0;i<konn-poczn+1;i++) { wynik+=t[poczn+i]*(__builtin_popcount(poczm+i)); } return wynik; } else if (konn-poczn+1>konm-poczm+1)return -LONG_MAX/2; for(long long i=poczn;i<konn;i++) { wynik=max(wynik,zrob(poczn,i,poczm,(poczm+konm)/2)+zrob(i+1,konn,(poczm+konm)/2+1,konm)); } wynik=max(wynik,zrob(poczn,konn,poczm,(poczm+konm)/2)); wynik=max(wynik,zrob(poczn,konn,(poczm+konm)/2+1,konm)); //cout<<poczn<<' '<<konn<<' '<<poczm<<' '<<konm<<' '<<wynik<<'\n'; return wynik; } int main() { ios_base::sync_with_stdio(0); cin>>n>>m; for(int i=1;i<=n;i++) { cin>>t[i]; } for(int i=2;i<=n;i++)dp[0][i]=-(1e18); for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { dp[i&1][j]=max(dp[(i&1)^1][j],dp[(i&1)^1][j-1]+t[j]*(__builtin_popcount(i))); if(i+1<j)dp[i&1][j]=-(1e18); //cout<<dp[i][j]<<'\n'; } //if(dp[i][n]>dp[i-1][n])cout<<__builtin_popcount(i)<<'\n'; } /*if(dp[m&1][n]==zrob(1,n,0,m))cout<<"TAK"<<'\n'; else cout<<"NIE"<<'\n';*/ cout<<dp[m&1][n]<<'\n'; //cout<<zrob(1,n,0,m); } |