absi2011's Blog & Daily Life.

全新的开始       我要省选翻盘       I wanna AK in 高考\化学       自此,生无可恋
[破碎的状态] [1] Hdu 4691(Failed)
[这个blog需要恢复] 432D

[这个Blog需要恢复] 568B

absi2011 posted @ Jul 19, 2017 02:21:56 PM in 刷题记录 with tags CF 小高考 碎碎念 DP , 335 阅读

我决定以一个Codeforces的题目来恢复我的Blog更新

以后还会有题目,也许也还会有碎碎念

我发现

也许写碎碎念就是一种很好的方案

至少

不会感觉有多难受吧

因为难受的东西写出来

就不再难受了么

嗯,先不写那么多碎碎念了吧

另外

从现在起

我决定自己尝试翻译题目

题意:

给一个数n

求有n个元素的情况下

求有多少个关系的规则(a-->b)

使得不满足:

自反(a-->a)

但要求满足

对称(a-->b : b-->a)

结合(a-->b/b-->c : a-->c)

Sample 2:

n=2

3种:

空规则

单规则1-->1

单规则2-->2

双dp

dp表示答案,dp2表示满足对称结合但不一定满足自反的答案

代码:

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<math.h>
#include<time.h>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<fstream>
#include<stdio.h>
#include<sstream>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[4005];
int dp2[4005];
int c[4005][4005];
const int modo=1000000007;
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    int n;
    scanf("%d",&n);
    int i;
    for (i=0;i<=n;i++)
    {
        int j;
        c[i][0]=1;
        for (j=1;j<=i;j++)
        {
            c[i][j]=c[i-1][j-1]+c[i-1][j];
            c[i][j]%=modo;
        }
    }
    dp[0]=0;
    dp2[0]=1;
    for (i=1;i<=n;i++)
    {
        int j;
        for (j=1;j<n;j++)
        {
            dp[i]=(dp[i]+(long long)dp[j]*c[i-1][i-j-1])%modo;
            dp2[i]=(dp2[i]+(long long)dp2[j]*c[i-1][i-j-1])%modo;
        }
        dp2[i]+=dp2[i-1];
        dp2[i]++;
        dp2[i]%=modo;
        dp[i]+=dp2[i-1];
        dp[i]%=modo;
        //printf("dp[%d] = %d               dp2[%d] = %d\n",i,dp[i],i,dp2[i]);
    }
    printf("%d\n",dp[n]);
    return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter