hdu3555(數字dp記憶化搜尋)

2021-06-22 16:46:13 字數 816 閱讀 7403

記憶化搜尋解法

#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...