ZJNU 1153 - 找单词——中级

状态转移

b[i]记录价值为i的单词种类数

d[j+k*i]+=b[j] , k<=a[i]&&j+k*i<=50

表示价值为j+k*i的单词可以由价值为j的单词加上k个i字母转移而来

最后统计即可

#include<stdio.h>
int main(){
    int T,t,i,j,k,a[27]={0},b[51],d[51],s;
    scanf("%d",&T);
    for(t=0;t<T;t++){
        for(i=1;i<27;i++)
            scanf("%d",&a[i]);
        for(i=0;i<51;i++)
            b[i]=d[i]=0;
        b[0]=1;
        for(i=1;i<27;i++){
            for(j=0;j<51;j++)
                for(k=0;k<=a[i]&&j+k*i<=50;k++)
                    d[j+k*i]+=b[j];
            for(j=0;j<51;j++){
                b[j]=d[j];
                d[j]=0;
            }
        }
        for(s=0,i=1;i<51;i++)
            s+=b[i];
        printf("%d\n",s);
    }
    return 0;
}

 

posted @ 2020-01-19 14:10  StelaYuri  阅读(122)  评论(0编辑  收藏  举报