1 条题解

  • 0
    @ 2025-4-9 20:34:52

    问题背景

    在这个问题中,有不同类型的珠子,苏丹喜欢特定的珠子组合。需要根据给定的珠子组合和饰带长度,计算出可以形成的不同饰带的数量。

    所有代码

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int dp[110][610];   
    int g[610][610]; 
    char da[610][110];
    int check(string a,string b)
    {
    	for(int i=1;i<a.size();i++)
    	{
    		if(a[i]!=b[i-1])
    		{
    			return false;
    		} 
    	}
    	return true;
    }   
    int main()
    {
    	while(1)
    	{
    		int n,l,m;
    		//cin>>n>>l>>m;
    		scanf("%d%d%d",&n,&l,&m);
    		if(n==0 && l==0 && m==0)
    		{
    			break;
    		}
    		memset(dp,0,sizeof(dp));
    		memset(g,0,sizeof(g));
    		for(int i=0;i<m;i++)
    		{
    			//cin>>da[i];
    			scanf("%s",da[i]);
    		}
    		for(int i=0;i<m;i++)
    		{
    			for(int j=0;j<m;j++)
    			{
    				if(check(da[i],da[j]))
    				{
    					g[i][j]=1;
    				}
    			}
    		}
    		/*
    		for(int i=0;i<m;i++)
    		{
    			for(int j=0;j<m;j++)
    			{
    				cout<<g[i][j]<<" ";
    			}
    			cout<<endl;
    		}*/	
    		int len=strlen(da[0]);	
    		for(int i=0;i<m;i++)
    		{
    			dp[len][i]=1;
    		}
    		for(int k=len;k<=l;k++)
    		{
    			for(int i=0;i<m;i++)
    			{
    				for(int j=0;j<m;j++)
    				{
    					if(g[i][j]==1)
    					{
    						dp[k+1][i]+=dp[k][j];
    					}
    				}
    			}
    		}
    		int ans=0;
    		for(int i=0;i<m;i++)
    		{
    			ans=ans+dp[l][i];
    		}
    		cout<<ans<<endl;
    	} 
    	return 0;
    }
    
    • 1

    信息

    ID
    619
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者