HDU 5965 三维dp 或 递推
题意:= =中文题
思路一:比赛时队友想的。。。然后我赛后想了一下想了个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;
- //看看会不会爆int!数组会不会少了一维!
- //取物问题一定要小心先手胜利的条件
- #include <bits/stdc++.h>
- using namespace std;
- #pragma comment(linker,"/STACK:102400000,102400000")
- #define LL long long
- #define ALL(a) a.begin(), a.end()
- #define pb push_back
- #define mk make_pair
- #define fi first
- #define se second
- #define haha printf("haha\n")
- /*
- 定义dp[i][j][k]表示第i个人放了j个剩下k个的种类数
- */
- const LL mod = ;
- const int maxn = 1e4 + ;
- LL dp[maxn][][];
- char ch[maxn];
- int a[maxn];
- int n;
- LL p[] = {, , };
- LL solve(){
- memset(dp, , sizeof(dp));
- for (int i = ; i <= ; i++) {
- if (a[] - i > ) continue;
- if (a[] - i < ) break;
- dp[][i][a[] - i] = p[i];
- }
- for (int i = ; i <= n; i++){
- for (int j = ; j <= ; j++){
- for (int k = ; k <= ; k++){
- if (a[i] - j - k > ) continue;
- if (a[i] - j - k < ) break;///目前放入j个,dp[i-1]剩下j个
- dp[i][j][a[i] - j - k] = (dp[i][j][a[i] - j - k] + p[j] * dp[i - ][k][j]) % mod;
- }
- }
- }
- LL ans = ;
- for (int i = ; i <= ; i++){
- if (i > a[n]) break;
- ans = (ans + dp[n][i][]) % mod;
- }
- return ans;
- }
- int main(){
- int t; scanf("%d", &t);
- while (t--){
- scanf("%s", ch);
- n = strlen(ch);
- bool flag = true;
- for (int i = ; ch[i] != '\0'; i++){
- a[i + ] = ch[i] - '';
- if ((i == || i == n - ) && ch[i] > ''){
- flag = false; break;
- }
- if (ch[i] > '') {
- flag = false; break;
- }
- }
- if (!flag) {
- printf("0\n"); continue;
- }
- printf("%I64d\n", solve());
- }
- return ;
- }
思路二:递推
和之前的dp类似,我们定义每次每次都只能往列上放,因此最多只能放两个。然后我们发现,如果第一个位置的地雷数确定了,后面所有的都确定了,那么我们只需要枚举一下,就有答案了
- //看看会不会爆int!数组会不会少了一维!
- //取物问题一定要小心先手胜利的条件
- #include <bits/stdc++.h>
- using namespace std;
- #pragma comment(linker,"/STACK:102400000,102400000")
- #define LL long long
- #define ALL(a) a.begin(), a.end()
- #define pb push_back
- #define mk make_pair
- #define fi first
- #define se second
- #define haha printf("haha\n")
- const int maxn = 1e4 + ;
- const LL mod = ;
- LL dp[maxn];
- char ch[maxn];
- int a[maxn];
- int n;
- int p[] = {, , };
- LL solve(){
- LL ans = ;
- for (int i = ; i <= && i <= a[]; i++){
- if (a[] - i > ) continue;
- dp[] = a[] - i;
- for (int j = ; j <= n; j++){
- dp[j] = a[j - ] - dp[j - ] - dp[j - ];
- }
- if (dp[n] + dp[n - ] != a[n]) continue;
- LL res = ;
- for (int j = ; j <= n; j++){
- res = res * p[dp[j]];
- if (res > mod) res %= mod;
- }
- ans = (ans + res) % mod;
- }
- return ans;
- }
- int main(){
- int t; cin >> t;
- while (t--){
- scanf("%s", ch);
- n = strlen(ch);
- bool flag = true;
- for (int i = ; i < n; i++){
- if ((i == || i == n-) && ch[i] > ''){
- flag = false; break;
- }
- if (ch[i] > ''){
- flag = false; break;
- }
- a[i + ] = ch[i] - '';
- }
- if (!flag) {
- printf("0\n"); continue;
- }
- printf("%I64d\n", solve());
- }
- return ;
- }
HDU 5965 三维dp 或 递推的更多相关文章
- 题解报告:hdu 2084 数塔(递推dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这 ...
- [AHOI2009]中国象棋 DP,递推,组合数
DP,递推,组合数 其实相当于就是一个递推推式子,然后要用到一点组合数的知识 一道很妙的题,因为不能互相攻击,所以任意行列不能有超过两个炮 首先令f[i][j][k]代表前i行,有j列为一个炮,有k列 ...
- UVa 926【简单dp,递推】
UVa 926 题意:给定N*N的街道图和起始点,有些街道不能走,问从起点到终点有多少种走法. 很基础的dp.递推,但是有两个地方需要注意,在标记当前点某个方向不能走时,也要同时标记对应方向上的对应点 ...
- hdu 1284 钱币兑换问题 (递推 || DP || 母函数)
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- 【BZOJ4944】【NOI2017】泳池 概率DP 常系数线性递推 特征多项式 多项式取模
题目大意 有一个\(1001\times n\)的的网格,每个格子有\(q\)的概率是安全的,\(1-q\)的概率是危险的. 定义一个矩形是合法的当且仅当: 这个矩形中每个格子都是安全的 必须紧贴网格 ...
- [NOI2017]泳池——概率DP+线性递推
[NOI2017]泳池 实在没有思路啊~~~ luogu题解 1.差分,转化成至多k的概率减去至多k-1的概率.这样就不用记录“有没有出现k”这个信息了 2.n是1e9,感觉要递推然后利用数列的加速技 ...
- HDU 5322 Hope ——NTT 分治 递推
发现可以推出递推式.(并不会) 然后化简一下,稍有常识的人都能看出这是一个NTT+分治的情况. 然而还有更巧妙的方法,直接化简一下递推就可以了. 太过巧妙,此处不表,建议大家找到那篇博客. 自行抄写 ...
- lightoj 1126 - Building Twin Towers(dp,递推)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1126 题解:一道基础的dp就是简单的递推可以设dp[height_left][ ...
随机推荐
- angularjs表单中enter键提交
html页面: <form class="smart-form" id="checkout-form" searchinput> <div c ...
- openstack私有云布署实践【16.2 Ubuntu1404 只有根分区镜像制作】
之所以要只有根分区镜像,是因为在创建VM或者调整云主机的硬盘大小时,它能自动扩容.无需人工介入 在原来的物理机10.40.41.1的CentOS 6.7上制作镜像. 宿主机坱要安装KVM相关软件: ...
- 阻塞与非阻塞、同步与异步 I/O模型
I/O模型 Linux 下的五种I/O模型 阻塞I/O(blocking I/O) 非阻塞I/O (nonblocking I/O) I/O复用(select 和poll) (I/O multiple ...
- 友元(友元函数、友元类和友元成员函数) C++
有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员. 友元(frend)机制允许一个类将 ...
- JQuery select option append
三种方法: $('select').append($('<option>', {value:1, text:'One'})); $('select').append('<option ...
- ios空模板配置
ios之Xcode6如何手动创建空工程模板 1.首先创建Single View Application 2.然后找到工程目录->Supporting Files ——>找到 info.pl ...
- HTML中的<audio>和<video>标签讲解
关于<audio>标签讲解:点击这里 这里来一段简单的html5的音频代码: <audio src="someaudio.wav"> 您的浏览器不支持 au ...
- 7 个 jQuery 最佳实践
前言 随着富网络应用(rich web applications)数量的增长,以及用户对快速交互响应的高期望,开发者开始使用JavaScript库来快速高效的完成一些重复性的工作.这其中最流行的Jav ...
- openwrt 中procd
https://wiki.openwrt.org/doc/techref/procd Procd:Openwrt的进程管理守护进程(process management daemon),它与初始化脚本 ...
- Storm 分配逻辑
ps:都是学习的别人的博客,只是做了个整理所有就写成了原创,其实都是人家的东西 当一个topology在storm cluster中运行时,它的并发主要跟3个逻辑对象相关:worker,executo ...