刷题记录:牛客NC20875舔狗舔到最后一无所有
传送门:牛客
题目描述:
作为队伍的核心,forever97很受另外两个队友的尊敬。
Trote_w每天都要请forever97吃外卖,但很不幸的是宇宙中心forever97所在的学校周围只有3家forever97爱吃的外卖。
如果Trote_w给forever97买了别家的外卖,forever97就会大喊“我不吃我不吃”。
但是forever97又不喜欢连续三天吃一种外卖。
如果Trote_w哪天忘了这件事并且三天给他买了同一家外卖,那么forever97就会把Trote_w的头摁进手机屏幕里。
作为Trote_w的好朋友,你能告诉他连续请forever97吃n天饭,有多少不同的购买方法吗?
输入:
2
3
500
输出:
24
544984352
[题外话]:标题好评!!!
对于这道题,emmm,应该是能看出来是一道dp题的,接下来的问题就是如何推出我们的dp方程了.
我们仔细的分析一下题意就能发现前后是存在关系的:
我们假设dp[i][j]
代表第j天吃第i中外卖的总方法(包括前面的)
那么对于第j-1
来说存在两种情况,假设我们的第j-1
天是和第j
天一样的,那么第j-2
天肯定就不能和其一样了,那么假设此时i=0
,此时我们就有dp[1][j-2]+dp[2][j-2]
中方法
假设我们的第j-1
天与我们的第j
天并不是一样的,那么贡献就是dp[1][j-1]+dp[2][j-1]
即可,因为第三天不需要管前面的情况
所以我们就可以得到这样的一个dp方程:
dp[0][j]=dp[1][j-2]+dp[2][j-2]+dp[1][j-1]+dp[2][j-1]
接下来直接递推即可,注意边界
一维数组优化:在我们的推理过程中我们还会发现其实在第j天吃任何食物的种类数是一样的,因此我们可以将其压缩成一维,但是对于这道题不优化照样能过,下面就不给出优化代码了
注意需要使用long long和取模
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <stack>
#include <deque>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x = 0, w = 1;char ch = getchar();for (; ch > '9' || ch < '0'; ch = getchar()) if (ch == '-') w = -1;for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';return x * w;
}
#define maxn 1000000
#define ll_maxn 0x3f3f3f3f3f3f3f3f
const double eps = 1e-8;
int T;
ll dp[4][100010];
const int mod=1e9+7;
int main() {memset(dp, 0, sizeof(dp));dp[0][0] = dp[1][0] = dp[2][0] = 0;dp[0][1] = dp[1][1] = dp[2][1] = 1;dp[0][2] = dp[1][2] = dp[2][2] = 3;for(int i=3;i<=100000;i++) {dp[0][i]=(dp[1][i-2]+dp[2][i-2]+dp[1][i-1]+dp[2][i-1])%mod;dp[1][i]=(dp[0][i-2]+dp[2][i-2]+dp[0][i-1]+dp[2][i-1])%mod;dp[2][i]=(dp[0][i-2]+dp[1][i-2]+dp[0][i-1]+dp[1][i-1])%mod;}T=read();int num;for(int i=1;i<=T;i++) {num=read();cout<<(dp[0][num]%mod+dp[1][num]%mod+dp[2][num]%mod)%mod<<endl;}return 0;
}
刷题记录:牛客NC20875舔狗舔到最后一无所有相关推荐
- 刷题记录:牛客NC24608[USACO 2011 Ope S]Learning Languages
传送门:牛客 题目描述: [USACO11OPEN]Learning Languages S 农夫约翰的 N ( 2 < = N < = 10 , 000 ) N(2<=N<= ...
- 刷题记录:牛客NC20811蓝魔法师
传送门:牛客 题目描述: "你,你认错人了.我真的,真的不是食人魔."--蓝魔法师 给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于等于k,两种方案不 同当且仅当存在 ...
- 刷题记录:牛客NC16129小小粉刷匠
传送门:牛客 题目描述: "lalala,我是一个快乐的粉刷匠",小名一边快活地唱着歌,一边开心地刷着墙",兴致突然被打断,"小名,你今天如果刷不 完这一栋楼的 ...
- 刷题记录:牛客NC17889新建 Microsoft Office Word 文档
传送门:牛客 题目描述: CSL正在学习<计算机办公自动化>文件的建立与删除. CSL发现,当他新建一个word文档时,会得到一个名为"新建 Microsoft Office W ...
- 刷题记录:牛客NC23049华华给月月准备礼物
传送门:牛客 题目描述: 二月中旬虐狗节前夕,华华决定给月月准备一份礼物.为了搭建礼物的底座,华华需要若干根同样长的木棍.华华手头上有一些长度参差不齐的木棍,他想将每根都裁剪成若干段自己想要的长度,并 ...
- 刷题记录:牛客NC17193简单瞎搞题
传送门;牛客 题目描述: 一共有 n个数,第 i 个数是 xi xi 可以取 [ l i , r i ] [li , ri] [li,ri] 中任意的一个值. 设 S = ∑ x i 2 S = \s ...
- 刷题记录:牛客NC16122郊区春游
传送门:牛客 题目描述: 今天春天铁子的班上组织了一场春游,在铁子的城市里有n个郊区和m条无向道路,第i条道路连接郊区Ai和Bi, 路费是Ci.经过铁子和顺溜的提议,他们决定去其中的R个郊区玩耍(不考 ...
- 刷题记录:牛客NC24083Greedy Gift Takers
传送门:牛客 题目描述 Farmer John's nemesis, Farmer Nhoj, has NNN cows (1≤N≤1051 \leq N \leq 10^51≤N≤105), con ...
- 刷题记录:牛客NC15162小H的询问
传送门:牛客 题目描述: 小H给你一个数组{a},要求支持以下两种操作: 1. 0 l r(1<=l<=r<=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间被认 ...
最新文章
- gatsby_将您的GraphCMS数据导入Gatsby
- S2S ×××如何穿越NAT
- 去除警告:Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
- DB2 9 利用启示(733 测验)认证指南,第 7 部分: Java 编程(5)
- 使用 laravel 命令安装 Laravel
- pthread异步_探索 Flutter 异步消息的实现
- Service生命周期
- UI Startup analysis - sap.ui.core.Core what js files are loaded
- 玩转GIT系列之【git submodule update出错提示子模组未对路径注册】
- MySQL 左右两表比较问题
- Spark机器学习(7):KMenas算法
- idea文件为橙色去掉版本控制
- Android GsmCellLocation.getCellLocation返回NULL
- 开启本地git权限_Git入门使用和常见操作
- python在工程管理专业的应用_工程大数据在水利工程建设管理的应用
- withRouter有什么用?干嘛用?为啥要用它啊???一分钟理解!
- 推荐视频反馈系统设计
- 确定有限自动机DFA和非确定有限自动机NFA
- 如何恢复微信聊天记录,3个简单方法
- 机器学习过程步骤总结