两道不错的递推dp
hdoj-4055
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int mod=;
const int N=+;
long long sum[N][N];
char str[N];
int main ()
{
// 含义 dp[i][j] 前i个字母 以数字j结尾的排列方式 比如("II")-dp[2][3] 表示 “123”
//递推公式 如果str="I" dp[i][j]=dp[i-1][1]+dp[i-1][2]+...+dp[i-1][j-1];
//str="D" dp[i][j]=dp[i-1][j]+dp[i][j+1]+...+dp[i][i+1]
// 解释比如前i-1个排列 {3 1 4 2 5} 可以加一个 3 前面所有比3大的数加1(这样不会改变前面的增长顺序)
// 变成{4,1,5,2,6,3}
//sum[i][j]=dp[i][1]+dp[i][2]+...dp[i][j];
while (~scanf (" %s",str+)) {
int n=strlen(str+);
sum[][]=;
for (int i=;i<=n;i++) {
for (int j=;j<=i+;j++) {//i+1 因为i个字母表示i+1个数字
sum[i][j]=sum[i][j-];
if (str[i]!='D')
sum[i][j]+=sum[i-][j-];
if (str[i]!='I')
sum[i][j]+=sum[i-][i]-sum[i-][j-]+mod;
sum[i][j]%=mod;
}
}
printf ("%lld\n",sum[n][n+]);
}
return ;
}
hdoj-4489
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
LL dp[][];
LL f (int n,int m) { // f: C(n,m)
LL ans=;
if (m==) return ;
for (int i=n-m+;i<=n;i++)
ans*=i;
for (int i=;i<=m;i++)
ans/=i;
return ans;
}
int main ()
{
dp[][]=dp[][]=;
dp[][]=dp[][]=;// 在前i个数排好基础下排第j个
// dp[i][0] 以下降方式结尾 dp[i][1]以上升方式开始
// 第i个数排在下降方式结尾子序列和以上升方式开始子序列之间
for (int i=;i<=;i++) {
LL tmp=;
for (int j=;j<i;j++)
tmp+=dp[j][]*dp[i--j][]*f(i-,j);
dp[i][]=dp[i][]=tmp/;
}
int T;
scanf ("%d",&T);
while (T--) {
int x,n;
scanf ("%d %d",&x,&n);
if (n==) printf ("%d 1\n",x);// 注意这个特殊情况
else printf ("%d %lld\n",x,*dp[n][]);
}
return ;
}
两道不错的递推dp的更多相关文章
- 递推DP URAL 1017 Staircases
题目传送门 /* 题意:给n块砖头,问能组成多少个楼梯,楼梯至少两层,且每层至少一块砖头,层与层之间数目不能相等! 递推DP:dp[i][j] 表示总共i块砖头,最后一列的砖头数是j块的方案数 状态转 ...
- 递推DP UVA 607 Scheduling Lectures
题目传送门 题意:教授给学生上课,有n个主题,每个主题有ti时间,上课有两个限制:1. 每个主题只能在一节课内讲完,不能分开在多节课:2. 必须按主题顺序讲,不能打乱.一节课L时间,如果提前下课了,按 ...
- poj 2229 【完全背包dp】【递推dp】
poj 2229 Sumsets Time Limit: 2000MS Memory Limit: 200000K Total Submissions: 21281 Accepted: 828 ...
- Code Force 429B Working out【递推dp】
Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the ...
- 递推DP URAL 1167 Bicolored Horses
题目传送门 题意:k个马棚,n条马,黑马1, 白马0,每个马棚unhappy指数:黑马数*白马数,问最小的unhappy值是多少分析:dp[i][j] 表示第i个马棚放j只马的最小unhappy值,状 ...
- 递推DP URAL 1260 Nudnik Photographer
题目传送门 /* 递推DP: dp[i] 表示放i的方案数,最后累加前n-2的数字的方案数 */ #include <cstdio> #include <algorithm> ...
- 递推DP URAL 1353 Milliard Vasya's Function
题目传送门 /* 题意:1~1e9的数字里,各个位数数字相加和为s的个数 递推DP:dp[i][j] 表示i位数字,当前数字和为j的个数 状态转移方程:dp[i][j] += dp[i-1][j-k] ...
- 递推DP URAL 1119 Metro
题目传送门 /* 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 递推DP:仿照JayYe,处理的很巧妙,学习:) 好 ...
- 递推DP 赛码 1005 Game
题目传送门 /* 递推DP:官方题解 令Fi,j代表剩下i个人时,若BrotherK的位置是1,那么位置为j的人是否可能获胜 转移的时候可以枚举当前轮指定的数是什么,那么就可以计算出当前位置j的人在剩 ...
随机推荐
- numpy ndarray
>>> aarray([[1, 2], [3, 4]])>>> a.shape(2, 2)>>> barray([2, 3])>>&g ...
- AdaBoost, LogitBoost and GradientBoosting
前向分步算法与加法模型(forward stagewise algorithm and additive model) (1) AdaBoost:前向分步算法中损失函数取指数损失函数 (2) Logi ...
- Win10系列:VC++媒体播放控制1
在MediaElement控件中定义了用于控制视频播放的函数,如Play.Pause和Stop等函数.本小节将在20.6.1小节所新建的项目基础上继续来介绍如何为视频添加播放控制,并在最后一部分给出项 ...
- Dev-cpp怎样去掉括号匹配?
很多编C/C++的同学在用Dev-cpp的时候,就感觉到括号匹配很烦,又不知道哪里去掉. 所以,让ljn告诉你怎样去掉括号匹配. 1.打开Dev-cpp. 2.在菜单栏上,点击“工具[T]”,选择“编 ...
- NTT模板(无讲解)
#include<bits/stdc++.h>//只是在虚数部分改了一下 using namespace std; typedef long long int ll; ; ; ; ; ll ...
- 搭建Hadoop2.7.1的分布式集群
Hadoop 2.7.1 (2015-7-6更新),hadoop的环境配置不是特别的复杂,但是确实有很多细节需要注意,不然会造成许多配置错误的情况.尽量保证一次配置正确防止反复修改. 网上教程有很多关 ...
- sass 继承 占位符 %placeholder
@extend //SCSS .btn { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } .btn-primary { b ...
- 安装babel
http://jamesknelson.com/using-es6-in-the-browser-with-babel-6-and-webpack/
- Cracking The Coding Interview 1.8
//Assume you have a method isSubstring which checks if one word is a substring of another. //Given t ...
- DevExpress ASP.NET v18.2新功能详解(一)
行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress ASP.NET Cont ...