Ural 2018The Debut Album(DP)

题目地址:Ural 2018

简单DP。用滚动数组。

代码例如以下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL __int64
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
int dp[3][3][400];
int main()
{
    int n, a, b, i, j;
    memset(dp,0,sizeof(dp));
    scanf("%d%d%d",&n,&a,&b);
    if(n==1) printf("2\n");
    else
    {
        dp[1][0][1]=1;
        dp[1][1][1]=1;
        for(i=2; i<=n; i++)
        {
            memset(dp[i&1],0,sizeof(dp[i&1]));
            for(j=1;j<=b;j++)
            {
                dp[i&1][0][1]+=dp[i+1&1][1][j];
                if(dp[i&1][0][1]>=mod) dp[i&1][0][1]%=mod;
                if(j==1) continue ;
                dp[i&1][1][j]+=dp[i+1&1][1][j-1];
                if(dp[i&1][1][j]>=mod) dp[i&1][1][j]%=mod;
            }
            for(j=1;j<=a;j++)
            {
                dp[i&1][1][1]+=dp[i+1&1][0][j];
                if(dp[i&1][1][1]>=mod) dp[i&1][1][1]%=mod;
                if(j==1) continue ;
                dp[i&1][0][j]+=dp[i+1&1][0][j-1];
                if(dp[i&1][0][j]>=mod) dp[i&1][0][j]%=mod;
            }
        }
        int ans=0;
        for(i=1;i<=a;i++)
        {
            ans+=dp[n&1][0][i];
            if(ans>=mod)
                ans%=mod;
        }
        for(i=1;i<=b;i++)
        {
            ans+=dp[n&1][1][i];
            if(ans>=mod)
                ans%=mod;
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-12-28 06:07:59

Ural 2018The Debut Album(DP)的相关文章

URAL 1167. Bicolored Horses (DP)

题目链接 题意 :农夫每天都会放马出去,然后晚上把马赶入马厩,于是让马排成一行入马厩,但是不想马走更多的路,所以让前p1匹入第一个马厩,p2匹马入第二个马厩…………但是他不想让他的任何一个马厩空着,所有的马都必须入马厩.有两种颜色的马,如果 i 匹黑马与 j 匹白马同在一个马厩,不愉快系数是 i * j,总系数就是k个系数相加.让总系数最小. 思路 : dp[i][j] 代表的是前 i 个马厩放 j 匹马的最小不愉快系数值. 1 //1167 2 #include <cstdio> 3 #in

URAL 1073 Square Country(DP)

题目链接 题意 :这个人要投资地,每块地都是正方形并且边长都是整数,他希望他要买的地尽量的少碎块.每买一块地要付的钱是边长的平方,而且会得到一个一份证书,给你一个钱数,让你求出能得到的证书个数. 思路 :其实就是求x12+x22+--+Xn2中的最小的n. 1 //1073 2 #include <stdio.h> 3 #include <iostream> 4 #include <math.h> 5 6 using namespace std ; 7 8 int a[

Ural 1146 Maximum Sum(DP)

题目地址:Ural 1146 这题是求最大子矩阵和.方法是将二维转化一维. 首先用n*n的方法来确定矩阵的列.需要先进行预处理,只对每行来说,转化成一维的前缀和,这样对列的确定只需要前后两个指针来确定,只需要用前缀和相减即可得到.前后两个指针用n*n的枚举. 确定好了哪几列,那么再确定行的时候就转化成了一维的最大连续子序列的和.再来一次O(n)的枚举就可以. 这样,总复杂就变成了O(n^3),对于n为100来说,已经足够了. 代码如下: #include <iostream> #include

Ural 1586 Threeprime Numbers(DP)

题目地址:Ural 1586 先定义一个prime三维数组来记录素数,若i*100+j*10+k为素数,则标记prime[i][j][k]为1,否则为0.这样对后面的处理很方便. 然后定义一个dp三维数组,dp[n][i][j]表示当前n位的十位数字为i,个位数字为j时的素数个数,这时候状态要从prime[k][i][j]为素数时转移过来,所以状态转移方程为: if(prime[j][k][h])         dp[i][k][h]+=dp[i-1][j][k] 代码如下: #include

Ural 1073 Square Country (DP)

题目地址:Ural 1073 DP水题.也可以说是背包. #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include

URAL 1183 Brackets Sequence(DP)

题目链接 题意 : 给你一串由括号组成的串,让你添加最少的括号使该串匹配. 思路 : 黑书上的DP.dp[i][j] = min{dp[i+1][j-1] (sh[i] == sh[j]),dp[i][k]+dp[k+1][j](i<=k<j)}.输出的时候递归,其实我觉得输出比dp部分难多了..... 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 5 using nam

ural Mnemonics and Palindromes (dp)

http://acm.timus.ru/problem.aspx?space=1&num=1635 给出一个字符串,将这个字符串分成尽量少的回文串. 起初没有思路,想着应该先预处理出所有的回文串,然后进行dp.但是字符串的长度是4000,O(n^3)肯定不行,其实可以转化为O(n^2),就是枚举中点而不是枚举起点和终点,又NC了吧. 然后就是线性的dp了.dp[i]表示到第i位为止最少的回文串数,那么dp[i] = min(dp[i],dp[j+1]+1),j < i 且i到j也是回文串.

Ural 1353 Milliard Vasya&#39;s Function(DP)

题目地址:Ural 1353 定义dp[i][j],表示当前位数为i位时,各位数和为j的个数. 对于第i位数来说,总可以看成在前i-1位后面加上一个0~9,所以状态转移方程就很容易出来了: dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i][j-2]+.......+dp[i][j-9]: 最后统计即可. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <

Ural 1260 A nudnik photographer(DP)

A nudnik photographer 大意: 对1到N这些数进行排列,1必须要在最左边,相邻的两个数之间的差值不能超过2,问有多少种排列的方法. 思路: 对座位进行DP,当第一个是1,第二个是2的时候,组合为dp[i-1]:当第一个是1,第二个是3的时候,第三个也确定了是2,组合为dp[i-3]:还有最后一种情况是1357--8642. 所以DP方程为dp[i] = dp[i-1]+dp[i-3]+1. #include <stdio.h> int n; int dp[100]; int