HDU1708 Fibonacci String 动态规划

来源:互联网 发布:奥尼尔vs霍华德数据 编辑:程序博客网 时间:2024/06/18 09:57

题目大意:给定两个字符串s1和s2,以及一种给定的关系:s(n)=s(n-1)+s(n-2),让求出s(n)种每种字母的数量。

因为只让求出每种字母的数量,所以我们没必要求出s(n)具体是什么,只需把s(n-1)和s(n-2)中每种字母的数量纪录下来,然后相加即可。

#include <cstdio>#include <iostream>#include <cstring>using namespace std;const int MAX=40;int num[MAX*2][MAX];void init(char a[],char b[]){    int i,len1,len2;    len1=strlen(a);    len2=strlen(b);    for(i=0;i<len1;i++)      num[0][a[i]-'a']++;    for(i=0;i<len2;i++)      num[1][b[i]-'a']++;}int main(){    int k,t;    char str1[MAX],str2[MAX];    while(scanf("%d",&t)!=-1)      while(t--)      {          scanf("%s%s%d",str1,str2,&k);          memset(num,0,sizeof(num));          init(str1,str2);          int i,j;          if(k==0)            for(i=0;i<26;i++)              printf("%c:%d\n",i+'a',num[0][i]);          else if(k==1)            for(i=0;i<26;i++)              printf("%c:%d\n",i+'a',num[1][i]);          else          {              for(i=2;i<=k;i++)                for(j=0;j<MAX;j++)                  num[i][j]=num[i-1][j]+num[i-2][j];              for(i=0;i<26;i++)                printf("%c:%d\n",i+'a',num[k][i]);          }          printf("\n");      }      return 0;}

0 0
原创粉丝点击