TG2016D1T1&D2T1讲解

D1T1玩具谜题
纯模拟过。

#include
#include
#include
#include
#include
#include
#define fr(i,a,b) for(int i=a,_end_=b;i<=_end_;i++)
#define fd(i,a,b) for(int i=a,_end_=b;i>=_end_;i--)
using namespace std;
int a,b,n,m,x,g[100010];
char name[100010][20];
int main()
{
    freopen("toy.in","r",stdin);
    freopen("toy.out","w",stdout);
    scanf("%d%d",&n,&m);
    fr(i,1,n)
        scanf("%d%s",&g[i],&name[i]);//读入每个人的信息
    x=1;//当前的小人
    fr(i,1,m)
    {
        scanf("%d%d",&a,&b);
        a^=g[x];//面朝外与面朝内的方向相反
        a=a*2-1;//0->0*2-1=-1   1->1*2-1=1
        x+=a*b;//直接乘
        while(x<1)x+=n;//处理超界
        while(x>n)x-=n;
    }
    printf("%s\n",name[x]);
    return 0;
}

D2T1组合数问题
纯DP,DP 2次
一次求Cij,一次求答案。

C(x,y)=C(x1,y)+C(x1,y1)
(注意mod)
即每次看最后元素,选与不选的情况。
f(x,y)=f(x1,y)+f(x,y1)f(x1,y1)+(!c(x,y))
即计算(x,y)前共有多少个0。

#include
#include
#include
#include
#include
#include
#define fr(i,a,b) for(int i=a,_end_=b;i<=_end_;i++)
#define fd(i,a,b) for(int i=a,_end_=b;i>=_end_;i--)
using namespace std;
int t,k,f[2010][2010],c[2010][2010],n[10010],m[10010],maxn,maxm;
int main()
{
    freopen("problem.in","r",stdin);
    freopen("problem.out","w",stdout);
    scanf("%d%d",&t,&k);
    fr(i,1,t)
    {
        scanf("%d%d",&n[i],&m[i]);
        maxn=max(maxn,n[i]);
        maxm=max(maxm,m[i]);
    }
    memset(c,-1,sizeof(c));
    fr(i,0,maxn)
        c[i][0]=1;
    fr(i,0,min(maxn,maxm))
        c[i][i]=1;
    fr(i,2,maxn)
        fr(j,1,min(i-1,maxm))
            c[i][j]=(c[i-1][j-1]+c[i-1][j])%k;
    fr(i,1,maxn)
        fr(j,1,maxm)
            f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+(!c[i][j]);
    fr(i,1,t)
        printf("%d\n",f[n[i]][m[i]]);
    return 0;
}

你可能感兴趣的:(题解,DP,solution,模拟)