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;
}
};