10.5 数位dp

lc417

dfs双标记

class Solution {

public:

int dx4={0,0,1,-1};

int dy4={1,-1,0,0};

int m,n;

vector<vector<bool>> pvis,avis;

vector<vector<int>> ret;

//双标记法 不要搅合在一起

//!!!!!!清晰 正确是首要! 不要偷懒

vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights)

{

m=heights.size();

n=heights0.size();

pvis.resize(m,vector<bool>(n,false));

avis.resize(m,vector<bool>(n,false));

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

{

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

{

if(i==0 || j==0)

{

pvisij=true;

dfs(heights,i,j,pvis);

}

if(i==m-1 || j==n-1)

{

avisij=true;

dfs(heights,i,j,avis);

}

}

}

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

{

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

{

if(pvisij==true && avisij==true)

ret.push_back({i,j});

}

}

return ret;

}

//如何在DFS中区分双标记位呢

void dfs(vector<vector<int>>& heights,int i,int j,vector<vector<bool>>& vis)

{

for(int k=0;k<4;k++)

{

int x=i+dxk,y=j+dyk;

if(x>=0 && x<m && y>=0 && y<n

&& heightsij<=heightsxy

&& !visxy)

{

visxy=true;

dfs(heights,x,y,vis);

}

}

}

};

lc3704

数位dp

class Solution {

public:

long long countNoZeroPairs(long long n) {

const int MAXP = 20;

long long fMAXP222;

memset(f, -1, sizeof(f));

vector<int> A;

for (int p = 0; p < MAXP; p++, n /= 10) A.push_back(n % 10);

auto dp = \&(this auto &&dp, int pos, int c, int za, int zb) -> long long {

if (pos < 0) return c == 0 && za == 1 && zb == 1 ? 1 : 0;

long long &ret = fposczazb;

if (ret >= 0) return ret;

ret = 0;

// 枚举 a 这一位填什么

for (int a = 0; a <= 9; a++) {

if (a == 0 && za) continue;

// 枚举前一位是否进位

for (int cc = 0; cc <= 1; cc++) {

// 再根据这一位是否进位,就能算出 b 这一位要填什么

int b = Apos + (c ? 10 : 0) - a - cc;

if (b < 0 || b > 9) continue;

if (b == 0 && zb) continue;

ret += dp(pos - 1, cc, za || a > 0 ? 1 : 0, zb || b > 0 ? 1 : 0);

}

}

return ret;

};

return dp(MAXP - 1, 0, 0, 0);

}

};

模板

/*

//<https://oi-wiki.org/dp/number/\>

#include <cstdio>

using namespace std;

constexpr int N = 15;

using ll = long long;

ll l, r, dpN, miN;

ll ans1N, ans2N;

int aN;

void solve(ll n, ll *ans) {

ll tmp = n;

int len = 0;

while (n) a++len = n % 10, n /= 10;

for (int i = len; i >= 1; --i) {

for (int j = 0; j < 10; j++) ansj += dpi - 1 * ai;

for (int j = 0; j < ai; j++) ansj += mii - 1;

tmp -= mii - 1 * ai, ansa\[i] += tmp + 1;

ans0 -= mii - 1;

}

}

int main() {

scanf("%lld%lld", &l, &r);

mi0 = 1ll;

for (int i = 1; i <= 13; ++i) {

dpi = dpi - 1 * 10 + mii - 1;

mii = 10ll * mii - 1;

}

solve(r, ans1), solve(l - 1, ans2);

for (int i = 0; i < 10; ++i) printf("%lld ", ans1i - ans2i);

return 0;

}

*/

class Solution {

typedef long long ll;

public:

long long countNoZeroPairs(long long n)

{

if(n<=0)

return 0;

ll cnt1022;

ll m22;

bool init=false;

if(!init)

{

memset(cnt,0,sizeof(cnt));

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

{

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

{

for(int a=1;a<=9;a++)

{

for(int b=1;b<=9;b++)

{

int s=a+b+i;

if(s%10==d)

{

if(s>=10)

++cntdi1;

else

++cntdi0;

}

}

}

}

}

m00=m01=m10=m11=0;

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

{

m00+=cntd00;

m01+=cntd01;

m10+=cntd10;

m11+=cntd11;

}

init=true;

}

auto t_cnt=\&(int c,int l)->ll

{

ll dp0=(c==0);

ll dp1=(c==1);

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

{

ll ndp0=dp0*m00+dp1*m10;

ll ndp1=dp0*m01+dp1*m11;

dp0=ndp0;

dp1=ndp1;

}

return dp0;

};

int a20,len=0;

ll t=n;

while(t)

{

a++len=(int)(t%10);

t/=10;

}

ll ret=0;

ll eq0=1,eq1=0;

for(int i=len;i>=1;i--)

{

int cur=ai;

if(eq0)

{

for(int d=1;d<cur;d++)

{

ll w0=cntd00;

ll w1=cntd01;

if(w0)

ret+=eq0*w0*t_cnt(0,i-1);

if(w1)

ret+=eq0*w1*t_cnt(1,i-1);

}

}

if(eq1)

{

for(int d=1;d<cur;d++)

{

ll w0=cntd10;

ll w1=cntd11;

if(w0)

ret+=eq1*w0*t_cnt(0,i-1);

if(w1)

ret+=eq1*w1*t_cnt(1,i-1);

}

}

ll ne0=0,ne1=0;

if(eq0)

{

ne0+=eq0*cntcur00;

ne1+=eq0*cntcur01;

}

if(eq1)

{

ne0+=eq1*cntcur10;

ne1+=eq1*cntcur11;

}

eq0=ne0;

eq1=ne1;

}

ret+=eq0;

return ret;

}

};

相关推荐
hans汉斯3 分钟前
数据挖掘|基于BP神经网络的少数民族村寨文化型旅游体验产品潜在游客挖掘
深度学习·神经网络·算法·yolo·软件工程·bp·汉斯出版社
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】LLM会话管理模块设计
网络·c++·人工智能·学习·大模型
小此方2 小时前
「C++AI大模型接入SDK」(一) API接入与本地两种方式对比、API Key获取、API报文详解与简单API的构建
开发语言·c++·人工智能
v_348360876210 小时前
Android native端 堆栈打印
android·算法
residual_fan10 小时前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
GG-_-Bond10 小时前
9.1 kv存储resp协议模拟面试
c++
GreenTea10 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
米糕闯编程11 小时前
鱼香ros2(五)用C++编写节点
c++·ros2·cmakelists·鱼香
深圳满意度咨询11 小时前
医院满意度数字化测评系统:从数据采集到智能决策的技术实践
算法
xiangyun6112 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法