标签:put size dig char ret ios set 数位dp ace
还是非常想说
数位dp真的非常方便!
!。
数位dp真的非常方便!。!
数位dp真的非常方便!
!!
重要的事说三遍
该题转换规则跟进制差点儿相同 到z时进一位 如az下位为bc 上位必须比下位小
依据这个规则搜出全部情况就可以
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int dp[11][27]; int digit[11]; /* 1~26表示加的字母 0表示不加 有前导时 枚举pre+1 ~ 26-pos 没有的话枚举 0 ~ 26-pos */ int dfs(int pos,int pre,bool high) { if(pos == -1) return pre > 0; if(!high && ~dp[pos][pre]) return dp[pos][pre]; int i,en,ans = 0,st; en = high? digit[pos]: 26-pos; st = pre? pre+1: 0; for(i = st; i <= en; ++i) ans += dfs(pos-1,i,high && i == en); if(!high) dp[pos][pre] = ans; return ans; } int Solve(char *str) { int i,len = strlen(str); for(i = 0; i < len; ++i) { digit[i] = str[len-i-1]-‘a‘+1; } return dfs(len-1,-1,1); } int main() { memset(dp,-1,sizeof(dp)); char str[11],i; scanf("%s",str); for(i = 0; str[i+1]; ++i) { if(str[i] >= str[i+1]) { puts("0"); return 0; } } printf("%d\n",Solve(str)); return 0; }
标签:put size dig char ret ios set 数位dp ace
原文地址:http://www.cnblogs.com/cxchanpin/p/6956123.html