1. 程式人生 > >poj:1850 Code(組合數學?數位dp!)

poj:1850 Code(組合數學?數位dp!)

urn font log strlen adc i++ 分享 依次 one

  題目大意:字符的字典序依次遞增才是合法的字符串,將字符串依次標號如:a-1 b-2 ... z-26 ab-27 bc-52。

  為什麽題解都是組合數學的...我覺得數位dp很好寫啊(逃

  f[pos][pre]前pos位,前一位是pre有幾個滿足條件的字符串,其實等同於這個字符串的序號是多少

  好像數位dp的博客真沒什麽東西好寫的...

技術分享
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
char s[20
]; int dp[20][50],a[20]; int dfs(int pos,int pre,bool lead,bool limit) { if(pos==0) if(lead)return 0;else return 1; if(!limit && dp[pos][pre]!=-1)return dp[pos][pre]; int up=limit?a[pos]:26; int ans=0,i; if(lead)i=pre;else i=pre+1; for(;i<=up;i++) ans+=dfs(pos-1,i,lead && i==0
,limit && i==a[pos]); if(!limit)dp[pos][pre]=ans; return ans; } int solve() { int pos=0; for(int i=0;i<strlen(s)-1;i++) if(s[i]>=s[i+1])return 0; for(int i=strlen(s)-1;i>=0;i--) a[++pos]=s[i]-a+1; return dfs(pos,0,1,1); } int main() { memset(dp,-1,sizeof
(dp)); scanf("%s",s); printf("%d\n",solve()); }
View Code

poj:1850 Code(組合數學?數位dp!)