#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); } |
English