記憶化搜尋解法
#include#include__int64 dp[25][3];//dp[pos][pre] pos記錄位數 pre記錄字首狀態0表示字首不包含49且pos+1不是4 1表示字首不包含49且pos+1位是4 2表示字首包含49
int digit[25];//存數的各位上的數字
int l;//存數的位數
__int64 dfs(int pos,int pre,int doing)
if(!doing&&dp[pos][pre]!=-1)return dp[pos][pre];//如果列舉的是自由位可以用以前記錄過的答案
int end,i;
end=doing?digit[pos]:9;//根據列舉的是不是自由位來決定列舉範圍
__int64 ans=0;
for(i=0;i<=end;i++)
else if(i==9&&pre==1)//如果pos+1位為4當前位為9 則以後的數字以此為字首包含49 pre=2
else if(i==4)//如果pre!=2 且當前位為4 則以後的數字pre=1
else// 以上條件都不滿足的話pre=0
ans+=dfs(pos-1,0,doing &&i==end);
}if(!doing)
dp[pos][pre]=ans;
return ans;
}__int64 solve(__int64 x)
return dfs(l-1,0,1);
}int main()
return 0;
}
hdu3555 模板化數字dp
jibancanyang author jibancanyang created time 五 4 15 23 43 25 2016 file name hdu3555 cpp problem 典型數字dp get 上次切這個題用的是水過去的方法,這次用模板化的dfs寫了下,其方法本質就是一位一位的...
hdu 3555 數字dp入門
題意 給定乙個long long型別能夠存下的數字n,統計1 n之間含有49的數字的個數 思路 初始版本 需要記錄當前位置,前一位置放了那個數字,當前是否已經包含49,是否有上界這四個資訊,也就是dfs的四個引數。dfs pos,pre,istrue,limit 其實這種做法有點相當於把普通的數字d...
hdu3555 數字dp 入門
題目大意 給乙個數字n,範圍在1 2 63 1,求1 n之間含有49的數字有多少個。思路 狀態轉移 dp i 0 代表長度為 i 並且不含有49的數字的個數 dp i 1 代表長度為 i 並且不含有49,但是最高位是9的數字的個數 dp i 2 代表長度為 i 並且含有49的數字的個數。陣列 a i...