數字DP之找等凹數字

2021-08-01 03:26:59 字數 1611 閱讀 3170

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

long long dp[20][20][10][2][2][2];

int num[20];

int s[20];

//第 i 位,長度為 len,上一位是什麼,前面是否遞增過,前面是否遞減過,當前是否符合回文串的性質,flag就是普通的前一位是否有限制,q是盤是否前導0

long long rec(int i,int pre,int up,int down,int flag,int q,int len,int ispa)

{ if(i<0)

return up&&down&&ispa;

if(dp[i][len][pre][up][down][ispa]!=-1&&!flag&&!q)

return dp[i][len][pre][up][down][ispa];

long long res=0;

int o=s[i];

for(int j=0;j<10;j++)

{num[i]=j;

if(j>o&&flag)

break;

if(q)

res+=rec(i-1,j,0,0,jpre)

{if(!down)

continue;

if(ispa&&i

未檢測,不能交題,但是應該是對的

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

int a[20];

int keep[20];

int dp[20][20][20][2][2][2];

ll dfs(int len,int pos,int pre,int up,int down,int limit,int flag0,int judge)

{ if(pos<0)

return up&&down&&judge;

if(!flag0&&!limit&&dp[len][pos][pre][up][down][judge]!=-1)

return dp[len][pos][pre][up][down][judge];

ll sum=0;

int tmp=a[pos];

for(int i=0;i<=9;i++)

{keep[pos]=i;

if(limit&&i>tmp)

break;

if(flag0)

sum+=dfs(len-(flag0&&i==0),pos-1,i,0,0,limit&&i==tmp,flag0&&i==0,judge);

else if(i==pre)

{if(judge&&pospre)

{if(!down)

continue;

if(judge&&pos

找順數 數字dp

輸出1到n中含有6的數的個數。100 19找規律感覺好難想 好像是什麼100以內有19個,200以內有19 2個,600以內115個,700以內214個.1000以內有271,2000以內有2 271個 就直接套數字dp的模板了。1 include2 include3 include4 using ...

Bomb(數字dp 找數模板)

算是找數的乙個模板題 題意尋找乙個不比輸入數大的正整數中有多少個含有 49 include include include include include using namespace std define ll long long ll dp 27 3 int a 27 dp i 0 長度為i但...

計數DP之數字

乙個數字被稱為好數字當他滿足下列條件 它有 2 n個數字,n 是正整數 允許有前導 0 構成它的每個數字都在給定的數字集合 s中。它前 n位之和與後 n 位之和相等或者它奇數字之和與偶數字之和相等。第一行乙個數 n。接下來乙個長度不超過 10的字串,表示給定的數字集合 不存在重複的數字 一行,乙個整...