子2023

【问题描述】
小蓝在黑板上连续写下从 1 到 2023 之间所有的整数,得到了一个数字序列:
S = 12345678910111213 . . . 20222023。
小蓝想知道 S 中有多少种子序列恰好等于 2023?
提示,以下是 3 种满足条件的子序列(用中括号标识出的数字是子序列包含的数字):
1234567891011121314151617181920212223...
1234567891011121314151617181920212223...
1234567891011121314151617181920212223...
注意以下是不满足条件的子序列,虽然包含了 2、0、2、3 四个数字,但是顺序不对:
1234567891011121314151617181920212223...

1.dp写法

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
typedef long long LL;
typedef pair<int,int> PII;
string s;
LL dp[5];

int main()
{
 	IOS;
	
	for(int i=1;i <= 2023;i++)	s+=to_string(i);

	for(int i=0;i < s.size();i++)
	{
		if(s[i] == '2')
		{
			dp[1]++;
			dp[3]+=dp[2];
		}
		
		if(s[i] == '0') dp[2]+=dp[1];
		if(s[i] == '3') dp[4]+=dp[3];
	}
		
	cout<<dp[4];
	
 	return 0;
}

2.剪枝后暴力

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
typedef long long LL;
typedef pair<int,int> PII;
string s;
LL ans=0;
string op="2023";

void dfs(int u,int cnt)
{
	if(cnt == 4)
	{
		ans++;
		return ;
	}
	if(u >= s.size()) return ;
	
	if(op[cnt] == s[u]) dfs(u+1,cnt+1);
	dfs(u+1,cnt);
}

int main()
{
 	IOS;
	
	for(int i=1;i <= 2023;i++)
	{
		string t=to_string(i);
		for(int j=0;j < t.size();j++)
		{
			if(t[j] == '2' || t[j] == '0' || t[j] == '3')
			s+=t[j];	
		}	
	} 	
	
	dfs(0,0);
	
	cout<<ans<<endl;
	
 	return 0;
}

枚举四个位置,只有数字放到该放的位置,才能填下一个位置,也可以选择不填。

相关推荐
geovindu15 分钟前
go: Recursion Algorithm
开发语言·后端·算法·golang·递归算法
十五年专注C++开发34 分钟前
qobject_cast转换失败原因分析
c++·qt·dynamic_cast·qobject_cast
小保CPP1 小时前
OCR C++ Tesseract按单词识别字符
c++·人工智能·ocr·模式识别·光学字符识别
库克克1 小时前
【C++】多态
开发语言·c++
Shadow(⊙o⊙)1 小时前
日志与线程池
linux·c++·算法
冷小鱼1 小时前
AI Agent 的核心算法:多智能体协作(Multi-Agent Systems)
前端·人工智能·算法·multi-agent·多智能体协作·systems
QN1幻化引擎1 小时前
# DalinX V8 灵鉴 V2:12维意识评测框架 —— 从 Tononi IIT 到 Friston FEP 的理论统一
数据库·人工智能·算法·机器学习·数据挖掘·agi
牧以南歌〆1 小时前
数据结构<一>顺序表
c语言·数据结构·算法
我不是懒洋洋1 小时前
从零实现一个分布式限流器:令牌桶与漏桶
c++
Fairy要carry2 小时前
面试-训练显存占用估计
算法