题目链接


题目大意:

就是给你n个平面和一个寿命为k的衰变粒子。开始粒子从左向右飞行,粒子每经过一个平面就会产生一个副本粒子,这个副本粒子比原粒子的寿命少1,即为k-1,并且飞行方向是原粒子的反方向。问最终可以产生多少个粒子?


解题思路1:

手动模拟一下发现,经过平面的反复产生粒子,会有很多复杂的中间情况,那么我们就要化简一下这种情况:
1.从原问题j的角度出发:一个寿命为k且要穿过n个平面最终产生的粒子个数?那么我们可以考虑一下dp,设dp[i][j]为寿命为i的粒子要穿过j个平面最终要产生的粒子个数。我们考虑状态转移,就是要考虑它和前面那个状态的关系,那么就是dp[i][j-1]:寿命为i的粒子穿过j-1个板子最终产生的粒子数+dp[i-1][n-j]:寿命为i的粒子穿过n-j个板子最终产生的粒子个数。[因为你还要穿过j个,那么你反方向就是n-j个板子]
2.考虑边界情况:dp[i][0] = 1, dp[1][i] = 1;


#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int maxn = 1e3 + 10;
int n, m;
ll f[maxn][maxn];
/*
f[i][j] : 寿命为i粒子要穿过j 个板子最终产生了多少个粒子
f[i][j] : f[i][j - 1] + f[i - 1][m - j];
*/
int main() { int T;cin >> T;while(T --) {cin >> n >> m;memset(f,0,sizeof(f));for(int i = 1; i <= n; ++ i) f[1][i] = 1;for(int i = 1; i <= m; ++ i) f[i][0] = 1;for(int i = 1; i <= m; ++ i) for(int j = 1; j <= n; ++ j)f[i][j] = (f[i][j - 1] + f[i - 1][n - j]) % mod;cout << f[m][n] << endl;}return 0;
}

解题思路2:记忆化搜索

对于一个粒子我们可以知道它有3种状态:即将要穿过哪个板子,寿命,飞行的方向
那么我们就可以设dp[depth][age][dirt]为dp方程进行记忆化搜索,实际上就是模拟单个粒子的穿板造成的结果。
#为什么可以进行记忆化搜索其实你在手摸的时候看起来很多粒子杂乱无章其实它们结果都是一样的,就是有很多结果是重叠的。


#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int maxn = 1e3+10;
ll dp[maxn][maxn][2];
int n, k;
inline ll dfs(int depth, int age, int dirt) {//age粒子即将穿过第depth板子的影响。if(age == 1) return 1;ll ans = 2;//包括自己和产生的粒子一共两个if(dp[depth][age][dirt] != -1) return dp[depth][age][dirt];if(dirt == 1) {if(depth < n) ans += dfs(depth+1,age,dirt) - 1; // 粒子向前进减到自己ans %= mod;if(depth > 1) ans += dfs(depth-1,age-1,1-dirt)-1;//副本粒子反向。ans %= mod; dp[depth][age][dirt] = ans;} else {if(depth > 1) ans += dfs(depth-1,age,dirt)-1;ans %= mod;if(depth < n) ans += dfs(depth+1,age-1,1-dirt)-1;ans %= mod;dp[depth][age][dirt] = ans;}return ans;
}int main() {int T;cin >> T;while(T --) {cin >> n >> k;memset(dp,-1,sizeof(dp));cout << dfs(1,k,1) << endl;}return 0;
}

思维dp ---- Codeforces Round #711 (Div. 2) - C. Planar Reflections[dp/记忆化搜索]相关推荐

  1. CodeCraft-21 and Codeforces Round #711 (Div. 2) C. Planar Reflections

    题意 给定一个衰变期为k的粒子,依次穿过n个墙(从左到右),每次穿过一个墙,都会在运动的反方向生成一个衰变期为k -1 的粒子,这个粒子仍保持原来的衰变期和方向穿下一个墙,生成的粒子沿反方向穿墙.直到 ...

  2. Codeforces Round #331 (Div. 2) D. Wilbur and Trees 记忆化搜索

    D. Wilbur and Trees Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/596/p ...

  3. 【Christmas Game】【CodeCraft-21 and Codeforces Round #711 (Div. 2)】【Nim-博弈】【树形DP】【拆分树】

    CodeCraft-21 and Codeforces Round #711 (Div. 2) Christmas Game Nim-博弈 树形DP 拆分树 牛客链接 https://ac.nowco ...

  4. CodeCraft-21 and Codeforces Round #711 (Div. 2) 题解

    先上链接CodeCraft-21 and Codeforces Round #711 (Div. 2) A: 从n开始往后找,不出几十个 一定能找到的,所以暴力就好了 void sovle(){cin ...

  5. CodeCraft-21 and Codeforces Round #711 (Div. 2)

    CodeCraft-21 and Codeforces Round #711 (Div. 2) 题号 题目 考点 A GCD Sum 签到,模拟 B Box Fitting 贪心 C Planar R ...

  6. Codeforces Round #743 (Div. 2) E. Paint 区间dp + 暴力

    传送门 文章目录 题意: 思路: 题意: 给你一个有nnn个像素的图像,每个像素都有一个颜色aia_iai​,保证每种颜色的图像不会超过202020个.你现在每次可以选择一个颜色,并选择一段连续的像素 ...

  7. Codeforces Round #709 (Div. 1) C. Skyline Photo dp + 单调栈优化

    传送门 文章目录 题意: 思路: 题意: 思路: 首先一个非常明显的dpdpdp式子就是f[i]=max(f[j]+val(j+1,i))f[i]=max(f[j]+val(j+1,i))f[i]=m ...

  8. Codeforces Round #627 (Div. 3) E. Sleeping Schedule dp

    传送门 文章目录 题意: 思路: 题意: 给你一天hhh小时,初始时间是000,每天可以使时间+ai+a_i+ai​或者+ai−1+a_i-1+ai​−1,问最多可以让多少天的时间在[l,r][l,r ...

  9. Codeforces Round #717 (Div. 2) D(倍增dp)

    Codeforces Round #717 (Div. 2) D 题意:n个数 q个询问,每一个询问有l和r,问你l到r这段区间中最少能分成几段,每一段中的数都是互质的. 思路:首先预处理出每一个点向 ...

最新文章

  1. springboot中文文档_登顶 Github 的 Spring Boot 仓库!艿艿写的最肝系列
  2. Eclipse搭建java分布式商城项目
  3. SQL SERVER-Extendevent系统视图
  4. 理清逻辑,确保云原生时代应用开发的全生命周期安全
  5. 解决百度云下载过慢、Linux下载百度云数据问题
  6. Linux x86主机运行天数是是24.8的倍数都有可能引发oracle bug及解决方法
  7. 【CF gym 103260】40th Petrozavodsk Programming Camp, Day 5,2021.2.3 水题2题
  8. malformed utf-8 characters, possibly incorrectly encoded
  9. Windows10从 微软商店 安装 linux(ubuntu)
  10. 【Spring学习03】Spring简单入门实例
  11. 5G NR PUSCH non-codebook SRS/DMRS
  12. 项目上线流程-实时Flink
  13. 对于法线贴图(Normal Map) 的深入研究
  14. LintCode 138.子数组之和
  15. 前沿科技探究之AI在索引推荐的应用
  16. margin-top遇到的小问题
  17. 「HNSDFZ暑期集训 测试1」「LuoguT36488」 连连看
  18. SAP MIGO生产订单入库校验BADI增强MB_MIGO_BADI
  19. Python并发之协程gevent数据结构和实践(6)
  20. QP状态机学习①——QP状态机架构

热门文章

  1. MySQL数据库左连接查询left join ... on
  2. VUE的data数据对象
  3. RIPv2相对于RIPv1来说主要有3方面的改进。下面的选项中,RIPv2的特点不包括【两个题】
  4. 【小白学PyTorch】10.pytorch常见运算详解
  5. 每天2小时,吃透 985博士总结的这份保姆级OpenCV学习笔记(20G高清/PPT/代码)
  6. Windows10+Virtual box+ubuntu17.10
  7. MySQL 里的 Timestrap 和 DateTime 和 Java 中的 Date
  8. 【Linux】备份与压缩命令命令
  9. jira 配置自签SSL证书windowsAD域
  10. Net作业调度(一) -Quartz.Net入门