luogu1941 [NOIp2014]飞扬的小鸟 (dp)

设f[i][j]为到达(i,j)这个位置的最小操作数

就有$f[i][j]=min\{f[i-1][j+Y[i-1]],f[i-1][j-X[i-1]*k]+k\}$

然后考虑优化一下转移:

对于一系列模x[i-1]相同的高度,它们都可以转移到模x[i-1]相同的高度、而且在它们上边的点,所以只要从下往上做,不断地取一个最小值就可以了(会意 会意...)

要注意的是不管怎么操作,只要操作完高度>M都会变成=M,而且还可以从M点一下还维持在M

 1 #include<bits/stdc++.h>
 2 #define pa pair<int,int>
 3 #define lowb(x) ((x)&(-(x)))
 4 #define REP(i,n0,n) for(i=n0;i<=n;i++)
 5 #define PER(i,n0,n) for(i=n;i>=n0;i--)
 6 #define MAX(a,b) ((a>b)?a:b)
 7 #define MIN(a,b) ((a<b)?a:b)
 8 #define CLR(a,x) memset(a,x,sizeof(a))
 9 #define rei register int
10 using namespace std;
11 typedef long long ll;
12 const int maxn=10010,maxm=1010;
13 
14 inline ll rd(){
15     ll x=0;char c=getchar();int neg=1;
16     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
17     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
18     return x*neg;
19 }
20 
21 int N,M,K;
22 int x[maxn],y[maxn];
23 int f[2][maxm],l[maxn],h[maxn],ans=1,cnt;
24 bool istube[maxn];
25 
26 int main(){
27     // freopen("testdata.in","r",stdin);
28     rei i,j,k;
29     N=rd(),M=rd(),K=rd();
30     for(i=0;i<N;i++) x[i]=rd(),y[i]=rd();
31     for(i=0;i<=N;i++) l[i]=1,h[i]=M*2;
32     for(i=1;i<=K;i++){
33         int a=rd(),b=rd(),c=rd();
34         istube[a]=1;
35         l[a]=b+1;h[a]=c-1;
36     }
37     CLR(f,127);CLR(f[0],0);
38     bool b=1;
39     for(i=1;i<=N&&ans;i++){
40         CLR(f[b],127);
41         for(j=l[i];j<=min(M,h[i])&&j+y[i-1]<=min(M,h[i-1]);j++){
42             if(j+y[i-1]>=l[i-1]) f[b][j]=f[b^1][j+y[i-1]];
43         }
44         for(j=l[i-1];j<l[i-1]+x[i-1]&&j<=min(M,h[i-1]);j++){
45             int mm=f[b^1][j];
46             // printf("!%d %d\n",j,mm);
47             for(k=1;j+x[i-1]*k<=h[i];k++){
48                 int jk=j+x[i-1]*k;
49                 // printf("!!!%d %d\n",jk,mm);
50                 bool re=0;
51                 if(jk>M) jk=M,re=1;
52                 if(jk>=l[i]) f[b][jk]=min(f[b][jk],mm+1);
53                 ++mm;mm=min(mm,f[b^1][jk]);
54                 if(re) break;
55             }
56         }
57         for(ans=0,j=l[i];j<=h[i];j++){
58             // printf("%d %d %d\n",i,j,f[b][j]);
59             if(f[b][j]<=1e8) {ans=1;break;}
60         }
61         if(ans&&istube[i]) cnt++;
62         b^=1;
63     }
64     printf("%d\n",ans);
65     if(ans){
66         ans=1e8;
67         for(i=l[N];i<=min(M,h[N]);i++) ans=min(ans,f[b^1][i]);
68         printf("%d\n",ans);
69     }else{
70         printf("%d\n",cnt);
71     }
72     return 0;
73 }

 

转载于:https://www.cnblogs.com/Ressed/p/9703780.html

内容概要:本文档详细介绍了一个利用Matlab实现Transformer-Adaboost结合的时间序列预测项目实例。项目涵盖Transformer架构的时间序列特征提取与建模,Adaboost集成方法用于增强预测性能,以及详细的模型设计思路、训练、评估过程和最终的GUI可视化。整个项目强调数据预处理、窗口化操作、模型训练及其优化(包括正则化、早停等手段)、模型融合策略和技术部署,如GPU加速等,并展示了通过多个评估指标衡量预测效果。此外,还提出了未来的改进建议和发展方向,涵盖了多层次集成学习、智能决策支持、自动化超参数调整等多个方面。最后部分阐述了在金融预测、销售数据预测等领域中的广泛应用可能性。 适合人群:具有一定编程经验的研发人员,尤其对时间序列预测感兴趣的研究者和技术从业者。 使用场景及目标:该项目适用于需要进行高质量时间序列预测的企业或机构,比如金融机构、能源供应商和服务商、电子商务公司。目标包括但不限于金融市场的波动性预测、电力负荷预估和库存管理。该系统可以部署到各类平台,如Linux服务器集群或云计算环境,为用户提供实时准确的预测服务,并支持扩展以满足更高频率的数据吞吐量需求。 其他说明:此文档不仅包含了丰富的理论分析,还有大量实用的操作指南,从项目构思到具体的代码片段都有详细记录,使用户能够轻松复制并改进这一时间序列预测方案。文中提供的完整代码和详细的注释有助于加速学习进程,并激发更多创新想法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值