HDU 2082 找单词

总得来说就是一道水题,只不过可以包括很多关于基础母函数的概念

#include<iostream> #include<cstring> using namespace std; #define M 51 int main(){ int t; cin>>t; while(t--){ int charnum[27]={0},i,j,k,c1[M]={1},c2[M]={0},count; //c1[0]=1,可以说是母函数求值的一个入口,后面的步骤全部是从这里出发的,其实这类问题都是可以用DP来解决的,有中类似背包的感觉。 /* 这其中的思路大概就是, 第一个:它有多少个元素类型 第二个:它元素类型的个数 第三哥:它求解的各种方式,无非大多数都是一个计数的问题 说到底,这样的普通又简单的类型的生成函数,一般就是这样了。 当然你可以了解更多的类型母函数,不过这里就不再一一给出了,有兴趣的话百度是一种很好的选择 */ for(i=1;i<=26;i++) cin>>charnum[i]; for(i=1;i<=26;i++){ // 这个循环是对元素种类的计算 for(j=0;j<M;j++)//这个循环是对更新的基础值 for(k=0;k*i+j<M && k<=charnum[i];k++) //在基础点上更新的值 c2[k*i+j]+=c1[j]; for(j=0;j<M;j++) c1[j]=c2[j],c2[j]=0; } int sum=0; for(i=1;i<M;i++) sum+=c1[i]; cout<<sum<<endl; } return 0; }

你可能感兴趣的:(HDU 2082 找单词)