【noi 2.6_9267】核电站(DP)

题意:n个数中不能同时选连续m个或以上,问方案数。

解法:f[i][j]表示从前i个中选,到第i个已经连续选了j个。
j!=0时,  =f[i-1][j-1];j=0时, =f[i-1][0~m-1];

优化1:f[i][m]存f[i-1][0~m-1],就不用多for一重。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 using namespace std;
 5
 6 long long f[55][10];
 7 int main()
 8 {
 9     int n,m;
10     scanf("%d%d",&n,&m);
11     f[1][0]=f[1][1]=1,f[1][m]=2;
12     for (int j=2;j<m;j++) f[1][j]=0;
13     for (int i=2;i<=n;i++)
14     {
15      long long h=0;
16      f[i][0]=f[i-1][m];
17      f[i][1]=f[i-1][0];
18      h=f[i][0]+f[i][1];
19      for (int j=2;j<m;j++)
20      {
21        f[i][j]=f[i-1][j-1];
22        h+=f[i][j];
23      }
24      f[i][m]=h;
25     }
26     printf("%lld\n",f[n][m]);
27     return 0;
28 }

优化2:(由上面的方程推出)f[i]表示从前i个数中合法的方案数,即之前的f[i][m]。

i<m时,f[i]=2*f[i-1];每次对于第i个数可选或不选,方案数都各为f[i-1]。
i>=m时,则再-f[i-m-1];由于i=m时,i-m-1<0则单独写出了来-1(1~m的数都选的状态)。
可知-f[i-m-1]是因为每次f[i-1][]中不合法的都是f[i-1][m-1],而它也是从最初的=...=f[i-m][0]=f[i-m-1][0~m-1]=f[i-m-1][m]连等上来的,便是现在的-f[i-m-1]了。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 using namespace std;
 5
 6 long long f[55];
 7 int main()
 8 {
 9     int n,m;
10     scanf("%d%d",&n,&m);
11     f[0]=1;
12     for (int i=1;i<=m;i++) f[i]=2*f[i-1];
13     f[m]--;
14     for (int i=m+1;i<=n;i++) f[i]=2*f[i-1]-f[i-m-1];
15     printf("%lld\n",f[n]);
16     return 0;
17 }

注意——f[n][m]不是答案最大的状态,而是f[n][1]。因此看是否要用long long得看f[n][1]......

时间: 2024-10-01 06:39:50

【noi 2.6_9267】核电站(DP)的相关文章

BZOJ 2436 Noi嘉年华(优化DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2436 题意:有一些活动,起始时间持续时间已知.有两个场地.每个活动最多只能在一个场地举行,且两个场地同一时间不能都举行活动.但是同一场地同一时间可以举行多个活动.要求的是两个场地中活动数目少的场地的活动数目的最大值S.再输出某个活动必须被安排时的S值. 思路:我直接粘贴原思路了. 区间离散化,设A={嘉年华1的活动}, B={嘉年华2的活动},C={未安排的活动}. 设num[i][j

【BZOJ 2436】 2436: [Noi2011]Noi嘉年华 (区间DP)

2436: [Noi2011]Noi嘉年华 Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办.每个嘉年华可能包含很多个活动,而每个活动只能在一个嘉年华中举办. 现在嘉年华活动的组织者小安一共收到了 n个活动的举办申请,其中第 i 个活动的起始时间为 Si,活动的持续时间为Ti.这些活动都可以安排到任意一个嘉年华的会场,也可以不安排. 小安通过广泛的调查发现,如果某个时刻,两个嘉

noi 162 post office dp

大致题意: 有v个村庄,每个村庄有各自的位置,且每个位置互不相同.现在要在村庄上设立P个邮局,使每个村庄到最近的邮局的距离之和最小. 分析: 定义状态d[i][j]表示前i个村庄,在这i个村庄中设立j个邮局的最小距离.s[i][j]表示村庄i至村庄j这几个村庄中设立一个邮局的最小距离.如果设立一个邮局,那么邮局设立在(a+b)/2这个位置是最优的.所以可以分解成以下子问题: d[i][j]的最小值为d[k][j-1]的最小值加上s[k+1][i],s[k+1][i]为在k+1至i这几个村庄中设立

poj 1185 炮兵阵地(状态压缩dp)

Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格.图上其它白色网格均攻击不

ACM 学习心得

ACM 学习心得 STL:完美的艺术品 STL 由四大部分组成:算法.容器.迭代器.仿函数. 算法(algorithm) 算法定义了一组与实现无关的操作,也是 ACM 学习的核心.C++ 算法库的内容全都是一些比较基本的算法,包括移动.转换.遍历.删除.过滤等等.C++ 算法库本身是基于抽象的,在迭代器的抽象下,使得这些算法可以在不同结构的容器中重用.一个比较坑的地方就是我高中的时候学完 C++ 之后报名了 NOIP.那一年刚刚允许用 STL(之前一直不准用),然后我对于标准库的依赖很严重,连快

20190809 B组总结

DP专题比赛…… T1: 赛中: 一道简单的DP题,直接根据题意设了一个四维数组然后推了推就做完了. 赛后: 这是正解(但是为什么这个要设为5000ms的限时???) 设个500ms都不为过…… 题目正解: DP T2: 赛中: 这个题好难,放弃治疗…… 什么,好像可以DFS 于是快乐的DFS过掉样例…… 赛后: 居然愉快的拿了37.5分 不错不错…… 可是大佬说这道题可以用矩阵乘法,但是得先推出DP转移式 题目正解: DP+矩阵乘法 T3: 赛中: 这不是一道水题吗? 可是瞬间尴尬,我又不会了

(状压dp)NOI 2001(POJ 1185) 炮兵阵地

司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格.图上其它白色网格均攻击不到.从图上可见炮兵的攻击

【dp】【NOI 2015】【bzoj 4197】寿司晚宴

4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 58 Solved: 46 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n?1 种不同的寿司,编号 1,2,3,-,n?1,其中第 i 种寿司的美味度为 i+1 (即寿司的美味度为从 2 到 n). 现在小 G 和小 W

BZOJ 4197 NOI 2015 寿司晚宴 状压DP

4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status][Discuss] Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n?1 种不同的寿司,编号 1,2,3,-,n?1,其中第 i 种寿司的美味度为 i+1 (即