The 2021 ICPC Asia Shanghai Regional Programming Contest I
I. Steadily Growing Steam
题链
看完题发现可以暴力dp
最开始想的状态就是dp[i][j][k]就是左边已经i权重右边已经j权重并且用了k次乘二的maxv
然后我们时间复杂度算接近1e10左右 当时想的感觉2的次数不会太多 就在那里试了很多发
最后发现我们不必要记录两堆的权值 我们只要记录他们之差就可以了
然后dp[i][k]就是dp[i][k]相差i然后用了k次乘2
然后我们转移就只有5种
1.不选这一个 dp[i][k][x&1]=max{dp[i][k][x&1^1]}
2.选 但是不乘2 dp[i][k][x&1]=max{dp[i-w][k][x&1^1]} dp[i][k][x&1]=max{dp[i+w][k][x&1^1]}
3.选 但是乘2 dp[i][k][x&1]=max{dp[i-2w][k][x&1^1]} dp[i][k][x&1]=max{dp[i+2*w][k][x&1^1]}
最后答案就是dp[0][j][n&1]
int dp[1510][110][2]; void solve(){ int n,k;cin>>n>>k; memset(dp,-0x3f3f,sizeof dp); dp[0][0][0]=0; for(int i=1;i<=n;i++) { int w, v; cin >> v >> w; for (int j = 1500; j >= 0; j--) { for (int q = 0; q <= k; q++) { dp[j][q][i & 1] = max(dp[j][q][i & 1],dp[j][q][i & 1 ^ 1]); if (dp[j][q][i & 1 ^ 1] >= -INF / 2) { if (j + 2 * w <= 1500) dp[j + 2 * w][q + 1][i & 1] = max(dp[j + 2 * w][q + 1][i & 1], dp[j][q][i & 1 ^ 1] + v); if (j + w <= 1500)dp[j + w][q][i & 1] = max(dp[j + w][q][i & 1], dp[j][q][i & 1 ^ 1] + v); dp[abs(j - 2 * w)][q + 1][i & 1] = max(dp[abs(j - 2 * w)][q + 1][i & 1], dp[j][q][i & 1 ^ 1] + v); dp[abs(j - w)][q][i & 1] = max(dp[abs(j - w)][q][i & 1], dp[j][q][i & 1 ^ 1] + v); } } } } int ans=-INF; for(int j=0;j<=k;j++)ans=max({ans,dp[0][j][0],dp[0][j][1]}); cout<<ans<<endl; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!