题意:= =中文题

思路一:比赛时队友想的。。。然后我赛后想了一下想了个2维dp,但是在转移的时候,貌似出了点小问题...吧?然后就按照队友的思路又写了一遍。

定义dp[i][j][k],表示第i列,放j个,剩下k个的种类数。其中j<=2, k<=2,j<=2的来源是只往上、下放。然后状态转移就是

dp[i][j][a[i] - j - k] = (dp[i][j][a[i] - j - k] + p[j] * dp[i - 1][k][j]) % mod;

  1. //看看会不会爆int!数组会不会少了一维!
  2. //取物问题一定要小心先手胜利的条件
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. #pragma comment(linker,"/STACK:102400000,102400000")
  6. #define LL long long
  7. #define ALL(a) a.begin(), a.end()
  8. #define pb push_back
  9. #define mk make_pair
  10. #define fi first
  11. #define se second
  12. #define haha printf("haha\n")
  13. /*
  14. 定义dp[i][j][k]表示第i个人放了j个剩下k个的种类数
  15.  
  16. */
  17. const LL mod = ;
  18. const int maxn = 1e4 + ;
  19. LL dp[maxn][][];
  20. char ch[maxn];
  21. int a[maxn];
  22. int n;
  23. LL p[] = {, , };
  24.  
  25. LL solve(){
  26. memset(dp, , sizeof(dp));
  27. for (int i = ; i <= ; i++) {
  28. if (a[] - i > ) continue;
  29. if (a[] - i < ) break;
  30. dp[][i][a[] - i] = p[i];
  31. }
  32. for (int i = ; i <= n; i++){
  33. for (int j = ; j <= ; j++){
  34. for (int k = ; k <= ; k++){
  35. if (a[i] - j - k > ) continue;
  36. if (a[i] - j - k < ) break;///目前放入j个,dp[i-1]剩下j个
  37. dp[i][j][a[i] - j - k] = (dp[i][j][a[i] - j - k] + p[j] * dp[i - ][k][j]) % mod;
  38. }
  39. }
  40. }
  41. LL ans = ;
  42. for (int i = ; i <= ; i++){
  43. if (i > a[n]) break;
  44. ans = (ans + dp[n][i][]) % mod;
  45. }
  46. return ans;
  47. }
  48.  
  49. int main(){
  50. int t; scanf("%d", &t);
  51. while (t--){
  52. scanf("%s", ch);
  53. n = strlen(ch);
  54. bool flag = true;
  55. for (int i = ; ch[i] != '\0'; i++){
  56. a[i + ] = ch[i] - '';
  57. if ((i == || i == n - ) && ch[i] > ''){
  58. flag = false; break;
  59. }
  60. if (ch[i] > '') {
  61. flag = false; break;
  62. }
  63. }
  64. if (!flag) {
  65. printf("0\n"); continue;
  66. }
  67. printf("%I64d\n", solve());
  68. }
  69. return ;
  70. }

思路二:递推

和之前的dp类似,我们定义每次每次都只能往列上放,因此最多只能放两个。然后我们发现,如果第一个位置的地雷数确定了,后面所有的都确定了,那么我们只需要枚举一下,就有答案了

  1. //看看会不会爆int!数组会不会少了一维!
  2. //取物问题一定要小心先手胜利的条件
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. #pragma comment(linker,"/STACK:102400000,102400000")
  6. #define LL long long
  7. #define ALL(a) a.begin(), a.end()
  8. #define pb push_back
  9. #define mk make_pair
  10. #define fi first
  11. #define se second
  12. #define haha printf("haha\n")
  13. const int maxn = 1e4 + ;
  14. const LL mod = ;
  15. LL dp[maxn];
  16. char ch[maxn];
  17. int a[maxn];
  18. int n;
  19. int p[] = {, , };
  20.  
  21. LL solve(){
  22. LL ans = ;
  23. for (int i = ; i <= && i <= a[]; i++){
  24. if (a[] - i > ) continue;
  25. dp[] = a[] - i;
  26. for (int j = ; j <= n; j++){
  27. dp[j] = a[j - ] - dp[j - ] - dp[j - ];
  28. }
  29. if (dp[n] + dp[n - ] != a[n]) continue;
  30. LL res = ;
  31. for (int j = ; j <= n; j++){
  32. res = res * p[dp[j]];
  33. if (res > mod) res %= mod;
  34. }
  35. ans = (ans + res) % mod;
  36. }
  37. return ans;
  38. }
  39.  
  40. int main(){
  41. int t; cin >> t;
  42. while (t--){
  43. scanf("%s", ch);
  44. n = strlen(ch);
  45. bool flag = true;
  46. for (int i = ; i < n; i++){
  47. if ((i == || i == n-) && ch[i] > ''){
  48. flag = false; break;
  49. }
  50. if (ch[i] > ''){
  51. flag = false; break;
  52. }
  53. a[i + ] = ch[i] - '';
  54. }
  55. if (!flag) {
  56. printf("0\n"); continue;
  57. }
  58. printf("%I64d\n", solve());
  59. }
  60. return ;
  61. }

HDU 5965 三维dp 或 递推的更多相关文章

  1. 题解报告:hdu 2084 数塔(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这 ...

  2. [AHOI2009]中国象棋 DP,递推,组合数

    DP,递推,组合数 其实相当于就是一个递推推式子,然后要用到一点组合数的知识 一道很妙的题,因为不能互相攻击,所以任意行列不能有超过两个炮 首先令f[i][j][k]代表前i行,有j列为一个炮,有k列 ...

  3. UVa 926【简单dp,递推】

    UVa 926 题意:给定N*N的街道图和起始点,有些街道不能走,问从起点到终点有多少种走法. 很基础的dp.递推,但是有两个地方需要注意,在标记当前点某个方向不能走时,也要同时标记对应方向上的对应点 ...

  4. hdu 1284 钱币兑换问题 (递推 || DP || 母函数)

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  5. HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  6. 【BZOJ4944】【NOI2017】泳池 概率DP 常系数线性递推 特征多项式 多项式取模

    题目大意 有一个\(1001\times n\)的的网格,每个格子有\(q\)的概率是安全的,\(1-q\)的概率是危险的. 定义一个矩形是合法的当且仅当: 这个矩形中每个格子都是安全的 必须紧贴网格 ...

  7. [NOI2017]泳池——概率DP+线性递推

    [NOI2017]泳池 实在没有思路啊~~~ luogu题解 1.差分,转化成至多k的概率减去至多k-1的概率.这样就不用记录“有没有出现k”这个信息了 2.n是1e9,感觉要递推然后利用数列的加速技 ...

  8. HDU 5322 Hope ——NTT 分治 递推

    发现可以推出递推式.(并不会) 然后化简一下,稍有常识的人都能看出这是一个NTT+分治的情况. 然而还有更巧妙的方法,直接化简一下递推就可以了. 太过巧妙,此处不表,建议大家找到那篇博客. 自行抄写 ...

  9. lightoj 1126 - Building Twin Towers(dp,递推)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1126 题解:一道基础的dp就是简单的递推可以设dp[height_left][ ...

随机推荐

  1. angularjs表单中enter键提交

    html页面: <form class="smart-form" id="checkout-form" searchinput> <div c ...

  2. openstack私有云布署实践【16.2 Ubuntu1404 只有根分区镜像制作】

    之所以要只有根分区镜像,是因为在创建VM或者调整云主机的硬盘大小时,它能自动扩容.无需人工介入   在原来的物理机10.40.41.1的CentOS 6.7上制作镜像. 宿主机坱要安装KVM相关软件: ...

  3. 阻塞与非阻塞、同步与异步 I/O模型

    I/O模型 Linux 下的五种I/O模型 阻塞I/O(blocking I/O) 非阻塞I/O (nonblocking I/O) I/O复用(select 和poll) (I/O multiple ...

  4. 友元(友元函数、友元类和友元成员函数) C++

    有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员. 友元(frend)机制允许一个类将 ...

  5. JQuery select option append

    三种方法: $('select').append($('<option>', {value:1, text:'One'})); $('select').append('<option ...

  6. ios空模板配置

    ios之Xcode6如何手动创建空工程模板 1.首先创建Single View Application 2.然后找到工程目录->Supporting Files ——>找到 info.pl ...

  7. HTML中的<audio>和<video>标签讲解

    关于<audio>标签讲解:点击这里 这里来一段简单的html5的音频代码: <audio src="someaudio.wav"> 您的浏览器不支持 au ...

  8. 7 个 jQuery 最佳实践

    前言 随着富网络应用(rich web applications)数量的增长,以及用户对快速交互响应的高期望,开发者开始使用JavaScript库来快速高效的完成一些重复性的工作.这其中最流行的Jav ...

  9. openwrt 中procd

    https://wiki.openwrt.org/doc/techref/procd Procd:Openwrt的进程管理守护进程(process management daemon),它与初始化脚本 ...

  10. Storm 分配逻辑

    ps:都是学习的别人的博客,只是做了个整理所有就写成了原创,其实都是人家的东西 当一个topology在storm cluster中运行时,它的并发主要跟3个逻辑对象相关:worker,executo ...