【URAL 1513】Lemon Tale(DP+高精度)
2016-11-01 15:31
411 查看
【URAL 1513】Lemon Tale(DP+高精度)
题目大意:找出’L’和’B’组成的长N的串,满足连续的’L’的个数不超过M个的方案数。
考虑dp[i][j](1≤i≤n,0≤j≤m)表示遍历到第i个位置时,连续有j个’L’的方案数。
转移为dp[i][0]=∑0≤j≤mdp[i−1][j],dp[i][j]=dp[i−1][j−1](0<j≤m)暴力的话是108不知道给不给过。
想了个优化,令sum[i]=∑0≤j≤mdp[i][j],那么dp[i][0]=sum[i−1],最后答案就是sum[n]
现在考虑对sum的维护,每次转移时sum[i]=sum[i−1]−dp[i−1][m]+dp[i][0]
其实就是sum[i]=2∗sum[i−1]−dp[i−1][m],这样其实只要维护dp[i][m]就行了——双向队列,对首为dp[i][m],因为dp[i][m]=dp[i−1][m−1],所以每次取出对首dp[i−1][m],新的对首又变成dp[i][m]
PS:此题要高精度……BigNum就不贴了
代码如下:
题目大意:找出’L’和’B’组成的长N的串,满足连续的’L’的个数不超过M个的方案数。
考虑dp[i][j](1≤i≤n,0≤j≤m)表示遍历到第i个位置时,连续有j个’L’的方案数。
转移为dp[i][0]=∑0≤j≤mdp[i−1][j],dp[i][j]=dp[i−1][j−1](0<j≤m)暴力的话是108不知道给不给过。
想了个优化,令sum[i]=∑0≤j≤mdp[i][j],那么dp[i][0]=sum[i−1],最后答案就是sum[n]
现在考虑对sum的维护,每次转移时sum[i]=sum[i−1]−dp[i−1][m]+dp[i][0]
其实就是sum[i]=2∗sum[i−1]−dp[i−1][m],这样其实只要维护dp[i][m]就行了——双向队列,对首为dp[i][m],因为dp[i][m]=dp[i−1][m−1],所以每次取出对首dp[i−1][m],新的对首又变成dp[i][m]
PS:此题要高精度……BigNum就不贴了
代码如下:
#include <iostream> #include <cmath> #include <vector> #include <cstdlib> #include <cstdio> #include <climits> #include <ctime> #include <cstring> #include <queue> #include <stack> #include <list> #include <algorithm> #include <map> #include <set> #define LL long long #define Pr pair<int,int> #define fread(ch) freopen(ch,"r",stdin) #define fwrite(ch) freopen(ch,"w",stdout) using namespace std; const int INF = 0x3f3f3f3f; const int mod = 1e9+7; const double eps = 1e-8; const int maxn = 11234; deque <BigNum> q; int main() { //fread(""); //fwrite(""); int n,m; BigNum now,ze; now = 1; ze = 1; scanf("%d%d",&n,&m); for(int i = 0; i < m; ++i) q.push_back(0); q.push_back(ze); for(int i = 0; i < n; ++i) { ze = now; now = now*2-q.front(); q.pop_front(); q.push_back(ze); } now.print(); return 0; }
相关文章推荐
- URAL 1513. Lemon Tale(简单的递推)
- URAL 1513. Lemon Tale(简单的递推)
- URAL 1012 K-based Numbers. Version 2(DP+高精度)
- Ural 1012. K-based Numbers. Version 2 &&1013. K-based Numbers. Version 3 DP+高精度
- DP+高精度 URAL 1036 Lucky Tickets
- URAL - 1012 DP+高精度
- URAL - 1013 DP+高精度+滚动数组
- URAL 1036(dp+高精度)
- URAL 1036 Lucky Tickets (高精度,数位dp)
- URAL 1036 Lucky Tickets 【dp】【高精度】
- URAL 1326. Bottle Taps(简单的状压dp)
- URAL1965:Pear Trees(DP)
- URAL 1057. Amount of Degrees (数位DP)
- Ural_1012. K-based Numbers. Version 2(dp)
- Ural_1586. Threeprime Numbers (DP)
- ural 1519 Formula 1(轮廓线|插头DP|括号配对)
- hdu 1502 字符串dp与高精度运算(mark)
- URAL 1287. Mars Canals 滚动数组+DP
- 递推DP URAL 1009 K-based Numbers
- URAL 1073 Square Country(DP)