重走长征路---OI每周刷题记录---6月8日 2015

本文深入探讨了状压动态规划(DP)的原理及应用,通过具体题目“炮兵阵地”(P2704),详细解析了状态压缩、状态转移等关键步骤。文章记录了从初稿20分到AC的调试过程,分享了实现中遇到的常见错误及解决思路,适合对状压DP感兴趣的读者。

总目录详见https://blog.csdn.net/mrcrack/article/details/84471041

做题原则,找不到测评地址的题不做。2018-11-28

重走长征路---OI每周刷题记录---6月8日  2015

本周共计 题+题

测评地址:

Codeforces Round #290 (Div. 1)

1.拓扑排序:A.Fox And Names

2.记忆化搜索+map:B. Fox And Jumping

3.dancing link:3074.Sudoku

4.数位dp:3252.Round Numbers

5.模拟:1665.Biker’s Trip Odometer

6.数学:1930.Dead Fraction

7.模拟:1970.The Game

8.状压dp:1185.炮兵阵地   //在线测评地址https://www.luogu.org/problemnew/show/P2704

9.dp:2017: [Usaco2009 Nov]硬币游戏

10.dfs:[Usaco2005 Feb]Rigging the Bovine Election 竞选划区

11.暴力:1661: [Usaco2006 Nov]Big Square 巨大正方形

12.tarjan:1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会

13.dp+矩阵乘法:A:Quad Tiling

14.线段树:B:Garden

15.模拟:D:One-move checkmate

16.二分+贪心:E:ATP

17.费用流:「bzoj3308」九月的咖啡店

Codeforces Round #161 (Div. 2)

18.模拟:A.Beautiful Matrix

19.模拟:B. Squares

20.dfs:C. Circle of Numbers

21.dfs:D.Cycle in Graph

22.模拟:E. Rhombus

2015全国互测 3

23.排列组合:Country

24.「百度之星」数长方形 暴力

25.「百度之星」最强密码 暴力

26.「百度之星」大搬家 dp

题解:

Codeforces Round #290 (Div. 1)

1.拓扑排序:A.Fox And Names

2.记忆化搜索+map:B. Fox And Jumping

3.dancing link:3074.Sudoku

4.数位dp:3252.Round Numbers

5.模拟:1665.Biker’s Trip Odometer

6.数学:1930.Dead Fraction

7.模拟:1970.The Game

8.状压dp:1185.炮兵阵地

//P2704 [NOI2001]炮兵阵地
//在线测评地址https://www.luogu.org/problemnew/show/P2704
//发现,还是可以用状压dp的,先摸索,争取能弄出AC。
//第一步,计算每一行,可能的炮兵放置
//对左移,右移,运算符,还不是太熟,编码后才了解了。
//i<<1左移1位,i<<2左移2位,i>>1右移1位,i>>2右移2位,看到了吗,移动的位数一定放在右边。
//测试了,发现M=10,不考虑山,符合条件的有60个,故,数组在状态处,开到100即可
//if((tmp[j]&b)==0)state[i][cnt[i]]=tmp[j],cnt[i]++,printf("%d tmp%d\n",i,tmp[j]);//此处写成if(tmp[j]&b==0),查了好久,没想到&的优先级这么低
//搜索网络,发现,确实如此。
//写dp时,感觉思路有点乱,还是先停一停,想清楚了,再来。
//在dp的维度上想了很久,跨度一天,还是相通了,感觉很好。
//样例通过,提交20分,测试点2-9WA。2019-3-14
//什么地方有问题,
//以下为20分代码。
//https://www.cnblogs.com/hoskey/p/3737870.html此文转移方程写得不错
//样例通过,提交40分,测试点2,3,5,7-9WA。
//以下为40分代码。2019-3-15
//对比正确代码,跟踪了一个小时,才发现,处理dp时,将数据向下移动2行
//而读取字符串时,却未做同样的处理,导致数据不同步,该错误,难以查出
//牵一发而动全身。2019-3-15
//for(i=2;i<N+2;i++)scanf("%s",map[i]);//此处写成 for(i=0;i<N;i++)scanf("%s",map[i]); 
//修改,样例通过,提交AC。2019-3-15
//以下为AC代码。 
#include <stdio.h>
#include <string.h>
int N,M,tmp[100],num=0,state[105][100],cnt[100],dp[105][65][65],can[105][100],tmp2[100];//can[i][j]对应i行,j状态,部队数量。dp[i][j] 对应i行,状态j的最多部队数量
char map[105][12];
int max(int a,int b){
    return a>b?a:b;
}
void init(){
    int i,j,tot,b;
    tot=(1<<M)-1;
    for(i=0;i<=tot;i++)
        if(((i<<1)&i)==0&&((i<<2)&i)==0&&((i>>1)&i)==0&&((i>>2)&i)==0)//先筛出枚举的可能
            tmp[num]=i,num++;
    for(i=0;i<num;i++){
        j=tmp[i];
        while(j){
            if(j&1)tmp2[i]++;//部队数量
            j>>=1;
        }
    }
    state[0][0]=0,can[0][0]=0,cnt[0]=1,state[1][0]=0,can[1][0]=0,cnt[1]=1;//为了方便处理数据,添加2行
    for(i=2;i<N+2;i++){
        b=0;
        for(j=0;j<M;j++)
            if(map[i][j]=='H')
                b|=(1<<j);
        for(j=0;j<num;j++)
            if((tmp[j]&b)==0)state[i][cnt[i]]=tmp[j],can[i][cnt[i]]=tmp2[j],cnt[i]++;//此处写成if(tmp[j]&b==0),查了好久,没想到&的优先级这么低
    }
}
void solve(){
    int i,j,k,p,ans=0;
    for(i=2;i<N+2;i++)
        for(j=0;j<cnt[i];j++)
            for(k=0;k<cnt[i-1];k++)
                for(p=0;p<cnt[i-2];p++)
                    if((state[i][j]&state[i-1][k])==0&&(state[i][j]&state[i-2][p])==0&&(state[i-1][k]&state[i-2][p])==0)
                        dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][p]+can[i][j]);
    for(j=0;j<cnt[N+1];j++)
        for(k=0;k<cnt[N];k++)
            ans=max(ans,dp[N+1][j][k]);
    printf("%d\n",ans);
}
int main(){
    int i;
    scanf("%d%d",&N,&M);
    for(i=2;i<N+2;i++)scanf("%s",map[i]);//此处写成 for(i=0;i<N;i++)scanf("%s",map[i]);
    memset(cnt,0,sizeof(cnt)),memset(tmp2,0,sizeof(tmp2)),memset(dp,0,sizeof(dp));
    init();
    solve();
    return 0;
}

//P2704 [NOI2001]炮兵阵地
//在线测评地址https://www.luogu.org/problemnew/show/P2704
//发现,还是可以用状压dp的,先摸索,争取能弄出AC。
//第一步,计算每一行,可能的炮兵放置
//对左移,右移,运算符,还不是太熟,编码后才了解了。
//i<<1左移1位,i<<2左移2位,i>>1右移1位,i>>2右移2位,看到了吗,移动的位数一定放在右边。
//测试了,发现M=10,不考虑山,符合条件的有60个,故,数组在状态处,开到100即可
//if((tmp[j]&b)==0)state[i][cnt[i]]=tmp[j],cnt[i]++,printf("%d tmp%d\n",i,tmp[j]);//此处写成if(tmp[j]&b==0),查了好久,没想到&的优先级这么低
//搜索网络,发现,确实如此。
//写dp时,感觉思路有点乱,还是先停一停,想清楚了,再来。
//在dp的维度上想了很久,跨度一天,还是相通了,感觉很好。
//样例通过,提交20分,测试点2-9WA。2019-3-14
//什么地方有问题,
//以下为20分代码。
//https://www.cnblogs.com/hoskey/p/3737870.html此文转移方程写得不错
//样例通过,提交40分,测试点2,3,5,7-9WA。 
//以下为40分代码。2019-3-15 
#include <stdio.h>
#include <string.h>
int N,M,tmp[100],num=0,state[105][100],cnt[100],dp[105][65][65],can[105][100],tmp2[100];//can[i][j]对应i行,j状态,部队数量。dp[i][j] 对应i行,状态j的最多部队数量
char map[105][12];
int max(int a,int b){
    return a>b?a:b;
}
void init(){
    int i,j,tot,b;
    tot=(1<<M)-1;
    for(i=0;i<=tot;i++)
        if(((i<<1)&i)==0&&((i<<2)&i)==0&&((i>>1)&i)==0&&((i>>2)&i)==0)//先筛出枚举的可能
            tmp[num]=i,num++;
    for(i=0;i<num;i++){
        j=tmp[i];
        while(j){
            if(j&1)tmp2[i]++;//部队数量
            j>>=1;
        }
    }
    state[0][0]=0,can[0][0]=0,cnt[0]=1,state[1][0]=0,can[1][0]=0,cnt[1]=1;//为了方便处理数据,添加2行
    for(i=2;i<N+2;i++){
        b=0;
        for(j=0;j<M;j++)
            if(map[i][j]=='H')
                b|=(1<<j);
        for(j=0;j<num;j++)
            if((tmp[j]&b)==0)state[i][cnt[i]]=tmp[j],can[i][cnt[i]]=tmp2[j],cnt[i]++;//此处写成if(tmp[j]&b==0),查了好久,没想到&的优先级这么低
    }
}
void solve(){
    int i,j,k,p,ans=0;
    for(i=2;i<N+2;i++)
        for(j=0;j<cnt[i];j++)
            for(k=0;k<cnt[i-1];k++)
                for(p=0;p<cnt[i-2];p++)
                    if((state[i][j]&state[i-1][k])==0&&(state[i][j]&state[i-2][p])==0&&(state[i-1][k]&state[i-2][p])==0)
                        dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][p]+can[i][j]);
    for(j=0;j<cnt[N+1];j++)
        for(k=0;k<cnt[N];k++)
            ans=max(ans,dp[N+1][j][k]);
    printf("%d\n",ans);
}
int main(){
    int i;
    scanf("%d%d",&N,&M);
    for(i=0;i<N;i++)scanf("%s",map[i]);
    memset(cnt,0,sizeof(cnt)),memset(tmp2,0,sizeof(tmp2)),memset(dp,0,sizeof(dp));
    init();
    solve();
    return 0;
}

//P2704 [NOI2001]炮兵阵地
//在线测评地址https://www.luogu.org/problemnew/show/P2704
//发现,还是可以用状压dp的,先摸索,争取能弄出AC。
//第一步,计算每一行,可能的炮兵放置
//对左移,右移,运算符,还不是太熟,编码后才了解了。
//i<<1左移1位,i<<2左移2位,i>>1右移1位,i>>2右移2位,看到了吗,移动的位数一定放在右边。
//测试了,发现M=10,不考虑山,符合条件的有60个,故,数组在状态处,开到100即可
//if((tmp[j]&b)==0)state[i][cnt[i]]=tmp[j],cnt[i]++,printf("%d tmp%d\n",i,tmp[j]);//此处写成if(tmp[j]&b==0),查了好久,没想到&的优先级这么低
//搜索网络,发现,确实如此。
//写dp时,感觉思路有点乱,还是先停一停,想清楚了,再来。
//在dp的维度上想了很久,跨度一天,还是相通了,感觉很好。
//样例通过,提交20分,测试点2-9WA。2019-3-14
//什么地方有问题,
//以下为20分代码。

//经过长时间的思考,dp[i][j]=max(dp[i][j],can[i][j]+can[i-1][k]+dp[i-2][p]);发现can[i-1][k]有可能会与dp[i-3][q]冲突

//故上述转移方程错误。2019-3-15 19:23
#include <stdio.h>
#include <string.h>
int N,M,tmp[100],num=0,state[105][100],cnt[100],dp[105][100],can[105][100],tmp2[100];//can[i][j]对应i行,j状态,部队数量。dp[i][j] 对应i行,状态j的最多部队数量
char map[105][12];
int max(int a,int b){
    return a>b?a:b;
}
void init(){
    int i,j,tot,b;
    tot=(1<<M)-1;
    for(i=0;i<=tot;i++)
        if(((i<<1)&i)==0&&((i<<2)&i)==0&&((i>>1)&i)==0&&((i>>2)&i)==0)//先筛出枚举的可能
            tmp[num]=i,num++;
    for(i=0;i<num;i++){
        j=tmp[i];
        while(j){
            if(j&1)tmp2[i]++;//部队数量
            j>>=1;
        }
    }
    state[0][0]=0,can[0][0]=0,cnt[0]=1,state[1][0]=0,can[1][0]=0,cnt[1]=1;//为了方便处理数据,添加2行
    for(i=2;i<N+2;i++){
        b=0;
        for(j=0;j<M;j++)
            if(map[i][j]=='H')
                b|=(1<<j);
        for(j=0;j<num;j++)
            if((tmp[j]&b)==0)state[i][cnt[i]]=tmp[j],can[i][cnt[i]]=tmp2[j],cnt[i]++;//此处写成if(tmp[j]&b==0),查了好久,没想到&的优先级这么低
    }
}
void solve(){
    int i,j,k,p,ans=0;
    dp[0][0]=0,dp[1][0]=0;
    for(i=2;i<N+2;i++)
        for(j=0;j<cnt[i];j++)
            for(k=0;k<cnt[i-1];k++)
                for(p=0;p<cnt[i-2];p++)
                    if((state[i][j]&state[i-1][k])==0&&(state[i][j]&state[i-2][p])==0&&(state[i-1][k]&state[i-2][p])==0)
                        dp[i][j]=max(dp[i][j],can[i][j]+can[i-1][k]+dp[i-2][p]);
    for(j=0;j<cnt[N+1];j++)ans=max(ans,dp[N+1][j]);
    printf("%d\n",ans);
}
int main(){
    int i;
    scanf("%d%d",&N,&M);
    for(i=0;i<N;i++)scanf("%s",map[i]);
    memset(cnt,0,sizeof(cnt)),memset(tmp2,0,sizeof(tmp2)),memset(dp,0,sizeof(dp));
    init();
    solve();
    return 0;
}

9.dp:2017: [Usaco2009 Nov]硬币游戏

10.dfs:[Usaco2005 Feb]Rigging the Bovine Election 竞选划区

11.暴力:1661: [Usaco2006 Nov]Big Square 巨大正方形

12.tarjan:1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会

13.dp+矩阵乘法:A:Quad Tiling

14.线段树:B:Garden

15.模拟:D:One-move checkmate

16.二分+贪心:E:ATP

17.费用流:「bzoj3308」九月的咖啡店

Codeforces Round #161 (Div. 2)

18.模拟:A.Beautiful Matrix

19.模拟:B. Squares

20.dfs:C. Circle of Numbers

21.dfs:D.Cycle in Graph

22.模拟:E. Rhombus

2015全国互测 3

23.排列组合:Country

24.「百度之星」数长方形 暴力

25.「百度之星」最强密码 暴力

26.「百度之星」大搬家 dp

 

一、项目简介 本项目(HF24075 SDFeatureRivertraining)是一套以多路 PWM 多彩 LED 灯光控制为核心的固件方案,基于 PADAUK PMS 系列单片机。方案对蓝、青、粉等多色 LED 进行独立 PWM 调光,实现呼吸、渐变、流水等细腻灯光效果,并支持按键切换与传感器交互。其 PWM 调光结构清晰,是学习单片机 PWM、色彩混合与灯光算法的理想范例。 核心应用场景: 1. 氛围灯 / 流水灯产品开发 2. PWM 调光与色彩混合学习 3. 电子类课程设计 / 毕业设计 4. 灯光艺术与 DIY 项目 适配使用场景:学习练手、毕业设计、课程设计、创业售卖、实操实训,突出实用性与可落地性。 二、硬件核心配置 · 主控芯片:PADAUK(应广科技)PMS 系列 8 位 OTP 单片机 · 外接外设: - 多色 LED 灯组(蓝 / 青 / 粉等多路独立 PWM) - 轻触按键(模式切换) - 传感器(交互触发) · 操控设备: - 机身实体按键操控 三、核心功能介绍 1. 多路独立 PWM 调光:蓝、青、粉等 LED 各自独立占空比控制,实现精准亮度; 2. 呼吸 / 渐变 / 流水效果:通过 PWM 变化曲线营造丰富灯光律动; 3. 按键切换模式:轻触在多种灯效间循环切换; 4. 传感器交互:外部传感信号触发或联动灯光变化; 5. 低功耗设计:闲置进入低功耗,按需唤醒。 6. 参数可配:亮灭周期、渐变速度等可调,便于定制。 四、项目优势与亮点 · 灯光细腻:多路独立 PWM,效果远胜简单开关灯。 · 算法清晰:呼吸 / 渐变实现简洁,易于理解与移植。 · 扩展性强:可轻松增加颜色与模式,适配各类灯饰。 ·
一、项目简介 本项目(HF24069 Smart Gecko Platform,发射端 TX)是一套智能遥控平台发射端方案,主控采用 PADAUK PMS152 单片机。方案定位于'平台级'遥控输入端:集成多路按键扫描、传感器数据采集与 2.4G 无线发射,支持对码配对,可作为多种遥控产品的通用发射底座,亦适合作为 2.4G 发射端与输入处理的专项学习案例。 核心应用场景: 1. 通用遥控发射平台开发 2. 2.4G 发射端与按键矩阵学习 3. 单片机毕设 / 课设 4. 产品遥控输入端快速定制 适配使用场景:学习练手、毕业设计、课程设计、创业售卖、实操实训,突出实用性与可落地性。 二、硬件核心配置 · 主控芯片:PADAUK PMS152 8 位 OTP 单片机 · 外接外设: - 多路轻触按键(功能 / 方向输入) - 传感器接口(多路采集,约 161 处引用) - 2.4G 射频发射模块 - EEPROM 存储(对码地址) - LED 状态指示 · 操控设备: - 2.4G 无线发射遥控 - 机身实体按键操控 三、核心功能介绍 1. 多按键扫描:完善的按键状态机,支持单击、长按、组合键识别; 2. 传感器数据采集:内置多路传感读取,为遥控端智能化提供数据; 3. 2.4G 无线发射:稳定发射控制指令,与接收端对码配对; 4. 对码配对:上电进入配对,地址掉电保存,多设备互不干扰; 5. 低功耗设计:待机与间歇工作策略,延长遥控端电池寿命。
内容概要:《赛普斯Surpex用户操作手册》详细介绍了粗糙点云处理平台Surpex 2026B的功能与使用方法,涵盖从原始点云导入到三维建模的完整工作流程。软件包含八大核心模块:点云预处理、JRC节理粗糙度计算、粗糙面后处理、轮廓线后处理、面纹理参数计算(ISO 25178)、随机粗糙面生成、岩石碎片拼接及粗糙面实体建模,支持多格式数据导入与模块间数据流转,通过“工作台”实现全局数据管理与协同分析。各模块提供分步操作指引、参数说明与可视化设置,适用于岩石力学、工程地质与表面计量等领域的三维形貌分析与建模需求。; 适合人群:从事岩石力学、工程地质、摩擦学、表面计量等领域的科研人员、工程师及高校研究生,具备三维点云基础处理能力的技术人员;; 使用场景及目标:① 对岩石节理面或工程表面进行JRC粗糙度与ISO 25178面纹理参数的自动化计算;② 实现点云数据的去噪、摆正、裁剪与可视化出图;③ 生成符合目标统计特征的随机粗糙面用于数值模拟;④ 将破碎岩样碎片点云自动拼接还原为完整试件;⑤ 构建带有真实粗糙面的封闭三维实体模型,用于有限元仿真或3D打印; 阅读建议:建议结合手册附带的视频教程(模块1sy.mp4~模块8sy.mp4)对照学习,重点关注各模块间的衔接逻辑与数据卡片的保存加载机制,实际操作中应遵循推荐工作流以确保分析准确性与效率。
内容概要:本文针对辐照度与温度(辐温)双重扰动下独立光伏储能直流供电系统的建模与控制问题,提出了一种多模块耦合建模方法与双级电力电子变换器协同调控策略,并基于Simulink平台完成了系统级仿真验证。研究系统地整合了光伏阵列、储能电池、DC-DC变换器等关键子系统的动态特性,构建了能够反映环境扰动影响的耦合模型,有效刻画了系统内部能量流动关系。在此基础上,设计了结合最大功率点跟踪(MPPT)与储能系统双向充放电控制的双级协同调控架构,实现了在光照和温度剧烈波动条件下对直流母线电压的精确稳定控制与系统功率的动态平衡,显著提升了独立运行系统的供电可靠性与运行效率。; 适合人群:具备电力电子、新能源发电或自动控制等相关专业知识背景,从事光伏储能系统、微电网或分布式能源系统研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于独立光伏储能直流系统的建模仿真与动态性能分析;②为应对复杂环境扰动下的系统稳定性问题提供先进的控制策略设计与理论依据;③支撑科研项目攻关、高水平学术论文复现或实际工程系统开发中的仿真验证与方案优化需求。; 阅读建议:建议结合提供的Simulink仿真模型进行同步学习与验证,重点关注多模块耦合建模的物理机理与数学推导过程,深入理解双级协同控制策略的设计逻辑与参数整定方法,可进一步拓展至不同气候条件和负载工况下的鲁棒性测试与控制算法优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值