題意:給出一個編碼, 給n個單詞的字典, 求有多少個字典中單詞組成的語句可以編譯成所給編碼。
思路:答案數很大, 我們不難想到要用動態規劃的思想。 用d[i]表示到第i個編碼為止的答案數, 那麼起點就是d[0] = 1; 我們在第二層循環枚舉n個單詞的編碼, 如果能匹配,就轉移過去。
細節參見代碼:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int mod = 1000000000 + 7; const int INF = 1000000000; const int maxn = 10000 + 10; int T,n,m,d[maxn]; char table[26][10] = {{".-"},{"-..."},{"-.-."},{"-.."},{"."},{"..-."},{"--."}, {"...."},{".."},{".---"},{"-.-"},{".-.."},{"--"},{"-."},{"---"},{".--."}, {"--.-"},{".-."},{"..."},{"-"},{"..-"},{"...-"},{".--"},{"-..-"},{"-.--"},{"--.."}}; char buf[maxn][105], s[maxn], str[30]; int main() { scanf("%d",&T); while(T--) { scanf("%s%d",s,&n); for(int i=0;i<n;i++) int="" len="strlen(str);" j="0;j<len;j++)" i="0;i<len;i++)" a="strlen(buf[j]);" return="" pre=""><p> </p></n;i++)></queue></map></deque></list></set></cmath></cstdlib></bitset></stack></vector></string></iostream></algorithm></cstring></cstdio>