当前位置: 首页 > news >正文

10.5 数位dp

 

 

lc417

dfs双标记

class Solution {
public:
int dx[4]={0,0,1,-1};
int dy[4]={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=heights[0].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)
{
pvis[i][j]=true;
dfs(heights,i,j,pvis);
}
if(i==m-1 || j==n-1)
{
avis[i][j]=true;
dfs(heights,i,j,avis);
}
}
}

         for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(pvis[i][j]==true && avis[i][j]==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+dx[k],y=j+dy[k];
if(x>=0 && x<m && y>=0 && y<n
&& heights[i][j]<=heights[x][y]
&& !vis[x][y])
{
vis[x][y]=true;
dfs(heights,x,y,vis);
}
}

};

 

 

lc3704

数位dp

class Solution {
public:
long long countNoZeroPairs(long long n) {
const int MAXP = 20;
long long f[MAXP][2][2][2];
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 = f[pos][c][za][zb];
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 = A[pos] + (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, dp[N], mi[N];

ll ans1[N], ans2[N];

int a[N];

 

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++) ans[j] += dp[i - 1] * a[i];

    for (int j = 0; j < a[i]; j++) ans[j] += mi[i - 1];

    tmp -= mi[i - 1] * a[i], ans[a[i]] += tmp + 1;

    ans[0] -= mi[i - 1];

  }

}

 

int main() {

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

  mi[0] = 1ll;

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

    dp[i] = dp[i - 1] * 10 + mi[i - 1];

    mi[i] = 10ll * mi[i - 1];

  }

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

  for (int i = 0; i < 10; ++i) printf("%lld ", ans1[i] - ans2[i]);

  return 0;

}

*/

class Solution {

    typedef long long ll;

public:

    long long countNoZeroPairs(long long n) 

    {

        if(n<=0)

            return 0;

 

        ll cnt[10][2][2];

        ll m[2][2];

        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)

                                            ++cnt[d][i][1];

                                        else

                                            ++cnt[d][i][0];

                                    }

                                }

                        }

                    }

            }

            m[0][0]=m[0][1]=m[1][0]=m[1][1]=0;

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

                {

                    m[0][0]+=cnt[d][0][0];

                    m[0][1]+=cnt[d][0][1];

                    m[1][0]+=cnt[d][1][0];

                    m[1][1]+=cnt[d][1][1];

                }

            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*m[0][0]+dp1*m[1][0];

                    ll ndp1=dp0*m[0][1]+dp1*m[1][1];

                    dp0=ndp0;

                    dp1=ndp1;

                }

            return dp0;

        };

 

        int a[20],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=a[i];

                if(eq0)

                {

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

                        {

                            ll w0=cnt[d][0][0];

                            ll w1=cnt[d][0][1];

                            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=cnt[d][1][0];

                            ll w1=cnt[d][1][1];

                            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*cnt[cur][0][0];

                    ne1+=eq0*cnt[cur][0][1];

                }

                 if(eq1)

                {

                    ne0+=eq1*cnt[cur][1][0];

                    ne1+=eq1*cnt[cur][1][1];

                }

                eq0=ne0;

                eq1=ne1;

            }

        ret+=eq0;

        return ret;    

    }

};

 

http://www.dtcms.com/a/445557.html

相关文章:

  • 基于汽车钣金理念的门窗柔性生产系统重构方案
  • 做网站要哪些技术查企业法人信息查询平台
  • Go语言入门(20)-nil
  • Go基础:Go语言ORM框架GORM详解
  • 备案 网站备注网站用的服务器多少钱
  • 《API网关在智能制造产线协同中的定制化实践与可靠性重构》
  • 建设网站的调研报告校园电子商务网站建设规划书实例
  • 书生浦语第六期 L1-G2000
  • AI大事记9:从 AlexNet 到 ChatGPT——深度学习的十年跃迁(上)
  • 删除无限递归文件夹
  • PyCharm 核心快捷键大全 (Windows版)
  • Android15 状态栏适配
  • 云原生微服务:Kubernetes+Istio 魔法学院实战指南
  • 做调研有哪些网站推广普通话手抄报内容大全资料
  • Vue.js 自定义指令
  • Vue中$nextTick的使用
  • 【Linux系列】并发世界的基石:透彻理解 Linux 进程 — 进程状态
  • 开源 C++ QT QML 开发(四)复杂控件--Listview
  • 我朋友是做卖网站的八戒影视大全
  • 智能体模式(Agent Mode)与深度研究(Deep Research)概念学习
  • AI vs. Machine Learning vs. Deep Learning vs. Neural Networks
  • 什么网站个人可以建设做企业门户网站都
  • 深度学习(十四):正则化与L2正则化
  • 深入浅出 ArkTS:构建响应式 HarmonyOS 应用的现代语法与实践
  • react生态
  • 深度学习周报(9.29~10.5)
  • 【开题答辩全过程】以 ssm框架的智能校园服务系统为例,包含答辩的问题和答案
  • [论文阅读] (42)ASC25 基于大语言模型的未知Web攻击威胁检测
  • 长宁网站设计wordpress极速版
  • Linux - 进程状态