dp cf 20190613

A. Boredom

这个题目不难,但是我做的还比较复杂,不过还是很开心,至少做出来了,开始因为爆int了还wa了一发,搞得我以为自己做错了

#include <cstdio>
#include <cstdlib>
#include <map>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 100;
ll dp[maxn][2];
ll sum[maxn];

int main()
{
    int n, x, len = 0;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &x);
        sum[x] += x;
        len = max(len, x);
    }
    for(int i=1;i<=len;i++)
    {
        if(sum[i])
        {
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);
            dp[i][1] = dp[i - 1][0] + sum[i];
        }
        else
        {
            dp[i][0] = dp[i][1] = max(dp[i - 1][0], dp[i - 1][1]);
        }
    }
    printf("%lld\n", max(dp[len][0], dp[len][1]));
    return 0;
}
A

 

C. k-Tree

这个题目开始感觉有点难,后来好像也没有想象之中的那么难,

定义dp[i]表示组成数字i的方案数

#include <cstdio>
#include <cstdlib>
#include <map>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 100;
const int mod = 1e9 + 7;
ll dp1[110], dp2[110];//定义为权值和为i的方案数。

int main()
{
    int n, k, d;
    scanf("%d%d%d", &n, &k, &d);
    dp1[0] = dp2[0] = 1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
        {
            if (i < j) break;
            dp1[i] = (dp1[i] + dp1[i - j]) % mod;
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=d-1;j++)
        {
            if (i < j) break;
            dp2[i] = (dp2[i] + dp2[i - j]) % mod;
        }
    }
    printf("%lld\n", (dp1[n] - dp2[n]+mod)%mod);
    return 0;
}
C

 

posted @ 2019-06-13 09:37  EchoZQN  阅读(78)  评论(0)    收藏  举报