Purslane
2024-11-20 21:27:00
没切,可怕。
显然可以压缩后
肯定过不去,矩阵快速幂优化也不行。
本题需要用到结论:一定可以由某个长度为
证明是容易的。但是题解区的部分证明存在不严谨的地方。
如果长度为
固定前
考虑剩余
反证,注意
所以可以对前
本题的优化方法和普通题目有很大差异:提出了一个看起来相当强的结论,大规模缩减问题。需要很大的胆量做这种操作。
#include<bits/stdc++.h>
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=50;
int n,x,y,mul[MAXN],dp[2][(1<<22)];
int main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>x>>y;
if(x>y) swap(x,y);
ffor(i,1,x+y) mul[i]=n/(x+y)+(i<=n%(x+y));
memset(dp,-0x3f,sizeof(dp));
dp[0][0]=0;
ffor(i,1,x+y) {
int s=i&1;
ffor(o,0,(1<<y)-1) dp[s][o]=-0x3f3f3f3f;
ffor(o,0,(1<<y)-1) {
if(!(o&1)&&!(o&(1<<y-x))) dp[s][(o>>1)|(1<<y-1)]=max(dp[s][(o>>1)|(1<<y-1)],dp[s^1][o]+mul[i]);
dp[s][o>>1]=max(dp[s][o>>1],dp[s^1][o]);
}
}
int mx=0;
ffor(i,0,(1<<y)-1) mx=max(mx,dp[(x+y)&1][i]);
cout<<mx;
return 0;
}