Luogu UVA473 Raucous Rockers 题解 [ 蓝 ] [ 背包 ] [ 交换两维优化 ]
Raucous Rockers:如果这题
暴力 dp
首先根据选的光盘数和当前光盘剩余空间,我们可以设计出一个 dp:定义
这个背包的转移是显然的,这里不再赘述,时间复杂度
交换两维 dp
我们考虑一个下标值域很大时而值很小的 dp 的 trick:交换 dp 值与下标两维。
到这题上我们不难发现,dp 数组内的值一定
于是,我们一下就可以把
定义 pair
,于是可以写出如下转移:
其中
注意特判
统计答案的时候输出满足使用光盘数
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define lc(x) (tr[x].ls)
#define rc(x) (tr[x].rs)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
const int N=1005;
int n,t,m,a[N],ans=0,sid;
pi dp[N][N];
pi upd(pi ori,int w)
{
int x=ori.fi,y=ori.se+w;
if(y>t)x++,y=w;
if(w>t)x=0x3f3f3f3f;
return {x,y};
}
void solve(int id)
{
cin>>n>>t>>m;ans=0;
for(int i=1;i<=n;i++)
{
char x;
cin>>a[i];
if(i<n)cin>>x;
}
memset(dp,0x3f,sizeof(dp));
dp[0][0]={0,0};
for(int i=1;i<=n;i++)
{
for(int j=0;j<=i;j++)
{
dp[i][j]=dp[i-1][j];
if(j)dp[i][j]=min(dp[i][j],upd(dp[i-1][j-1],a[i]));
if(dp[i][j].fi+1<=m)ans=max(ans,j);
}
}
cout<<ans<<'\n';
if(id<sid)cout<<'\n';
}
int main()
{
//freopen("sample.in","r",stdin);
//freopen("sample.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>sid;
for(int i=1;i<=sid;i++)solve(i);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2024-03-04 Luogu P1220 关路灯 题解 [ 蓝 ][ 区间dp ]