当前位置:网站首页>2022蓝桥杯国赛B组-费用报销-(线性dp|状态dp)
2022蓝桥杯国赛B组-费用报销-(线性dp|状态dp)
2022-06-30 15:44:00 【可爱美少女】
题意:
就是给你n张票据,每个票据有个时间和价格,你可以选择一些,使得这些票据的日期任意两个差要>=k,然后让总价值最接近m,但是不能超过m。
思考:
当时比赛的时候我就定义的用到i这个票据最多能表示的数是多少。这样有个弊端,这样可以保证最大,但是可能会超过m,超过m的只能特判,所以这样不能保证最接近m。所以当这样感觉不太合适的时候,可以把总价值成为dp的状态,也就是枚举到i点的时候,为j状态是否可达。然后转移就行了。但是这样的复杂度是nnm,将近1e9。所以会超时,但是可以得大部分分。所以可以进行优化,优化的点就是这个日期只有365天,所以dp[i][j]为到第i天j状态是否可达。然后对于物品的枚举可以用个变量cnt来一直往后走,这样复杂度是n*m+365的。因为每个点只会走一次所以只会循环n次m。这样复杂度就够了。
代码:
经典的线性dp
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define PII pair<int,int >
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N = 1005;
int T,n,m,k;
PII va[N];
int res[N],sum[N];
int dp[1010][5010];
signed main()
{
IOS;
cin>>n>>m>>k;
res[1] = 31,res[2] = 28,res[3] = 31,res[4] = 30;
res[5] = 31,res[6] = 30,res[7] = 31,res[8] = 31;
res[9] = 30,res[10] = 31,res[11] = 30,res[12] = 31;
for(int i=1;i<=12;i++) sum[i] = sum[i-1]+res[i];
for(int i=1;i<=n;i++)
{
int a,b,c;
cin>>a>>b>>c;
int now = sum[a-1]+b;
va[i] = {
now,c};
}
sort(va+1,va+1+n);
int cnt = 1;
dp[0][0] = 1;va[0].fi = -100;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++) dp[i][j] |= dp[i-1][j];
for(int j=0;j<i;j++)
{
for(int t=va[i].se;t<=m;t++)
{
if(va[i].fi-va[j].fi>=k)
dp[i][t] |= dp[j][t-va[i].se];
}
}
}
int maxn = 0;
for(int i=m;i>=0;i--)
{
if(dp[n][i])
maxn = max(maxn,i);
}
cout<<maxn;
return 0;
}
优化后转化为状态dp
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define PII pair<int,int >
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N = 1005;
int T,n,m,k;
PII va[N];
int res[N],sum[N];
int dp[1010][5010];
signed main()
{
IOS;
cin>>n>>m>>k;
res[1] = 31,res[2] = 28,res[3] = 31,res[4] = 30;
res[5] = 31,res[6] = 30,res[7] = 31,res[8] = 31;
res[9] = 30,res[10] = 31,res[11] = 30,res[12] = 31;
for(int i=1;i<=12;i++) sum[i] = sum[i-1]+res[i];
for(int i=1;i<=n;i++)
{
int a,b,c;
cin>>a>>b>>c;
int now = sum[a-1]+b;
va[i] = {
now,c};
}
sort(va+1,va+1+n);
int cnt = 1;
dp[0][0] = 1;
for(int i=1;i<=365;i++)
{
for(int j=0;j<=m;j++) dp[i][j] |= dp[i-1][j];
while(cnt<=n&&va[cnt].fi==i)
{
for(int j=0;j<=m;j++)
{
if(i>=k&&j>=va[cnt].se) dp[i][j] |= dp[i-k][j-va[cnt].se];
else if(i<k&&j==va[cnt].se) dp[i][j] |= 1;
}
cnt++;
}
}
int maxn = 0;
for(int i=m;i>=0;i--)
{
if(dp[365][i])
maxn = max(maxn,i);
}
cout<<maxn;
return 0;
}
总结:
多多思考哈,多想一想类似可以解决的方法和优化。
边栏推荐
- Interview experience of service end test engineer
- halcon变量窗口的图像变量不显示,重启软件和电脑都没用
- Smart wind power: operation and maintenance of digital twin 3D wind turbine intelligent equipment
- 招标公告:2022年台州联通Oracle一体机和数据库维保服务项目
- 互联网研发效能之去哪儿网(Qunar)核心领域DevOps落地实践
- Policy Center > Malware > Malware
- MySQL master-slave configuration
- 备战数学建模36-时间序列模型2
- CloudXR如何推动XR的未来发展
- 超 Nice 的表格响应式布局小技巧
猜你喜欢
![Warning: [antd: Menu] `children` will be removed in next major version. Please use `items` instead.](/img/c1/99ad29789a669c4498fb93ce1fb009.png)
Warning: [antd: Menu] `children` will be removed in next major version. Please use `items` instead.

MySQL transaction / lock / log summary

What role does "low code" play in enterprise digital transformation?

Swagger's asp Net core web API help page

中国传奇教授李泽湘,正在批量制造独角兽

halcon变量窗口的图像变量不显示,重启软件和电脑都没用

CloudXR如何推动XR的未来发展

【Unity UGUI】ScrollRect 动态缩放格子大小,自动定位到中间的格子

Build cloud native observability capability suitable for organizations

大学生研究生毕业找工作,该选择哪个方向?
随机推荐
Arcmap操作系列:80平面转经纬度84
Smart wind power: operation and maintenance of digital twin 3D wind turbine intelligent equipment
备战数学建模33-灰色预测模型2
ASP. Net core signalr tutorial
爬虫(1) - 爬虫基础入门理论篇
Compulsory national standard for electronic cigarette GB 41700-2022 issued and implemented on October 1, 2022
CloudXR如何推动XR的未来发展
[algorithm] after summarizing the four linked lists, I brushed two interview questions
2022新消费半年盘点:行业遇冷,但这九个赛道依然吸金
CVPR 2022 - Tesla AI proposed: generalized pedestrian re recognition based on graph sampling depth metric learning
Generating verification code with sring
【Verilog基础】关于Clock信号的一些概念总结(clock setup/hold、clock tree、clock skew、clock latency、clock transition..)
Cesium-1.72 learning (earth model creation online offline tile)
Finally understand science! 200 pictures to appreciate the peak of human wisdom
招标公告:2022年台州联通Oracle一体机和数据库维保服务项目
抖快B为啥做不好综艺
flinkcdc如果监控的数据库为mongo就必须是集群版吗
ArcMap operation series: 80 plane to latitude and longitude 84
Go-Micro安装
备战数学建模34-BP神经网络预测2