偶数3的个数

输入

一个整数N

输出

输出这个N位数中有多少个数中有偶数个数字3

这个题怎么说呢,刚看到压根一点思路都没有,但是规律可以找出来?隐隐约约知道怎么做?

经典dp吧

一个的数的每一位都有一个3和9个除了3以外的数(这句话看似是废话,但其实挺重要QAQ)

令f(i)(0)为1~i中偶数个3的个数,f(i)(1)为1~i中奇数个3的个数

要想满足偶数个3满足:

前i个数是偶数个3,第i为不能选3

前i个数是奇数个3,第i个位必定选3

(以上看似是两个分类要依次算,但其实是两种情况,最后的结果是两种情况相加)

f(i)(0)=f(i-1)(0)*9+f(i-1)(1);//这里就是刚刚的那句话,有9个不是3的其他数字

f(i)(1)=f(i-1)(1)*9+f(i-1)(0);

因为算一个i的f奇数和偶数都要用到,所以每次还要把奇数也要算一下

还有!!

在最高位不能取0,所以要特判一下

都说到这了,代码依旧是清晰可人的哈哈哈

#include<iostream>
using namespace std;
const int N=1010;
int f[N][2];
int main(){
	int n;
	cin>>n;
	f[1][0]=9;
	f[1][1]=1;
	int k=9;
	for(int i=2;i<=n;i++)
	{
		if(i==n) k--;
		f[i][0]=f[i-1][0]*k+f[i-1][1];
		f[i][1]=f[i-1][1]*k+f[i-1][0];
	}
	cout<<f[n][0];
	return 0;
}
/*
令f[i][1]为1~i中奇数的个数
f[i][0]为1~i中偶数的个数
可以由前面推到后面
第i位偶数个3必须满足(和奇数偶数都有关系的):
前i个是偶数个3,第i位不能取3(第i位有9个)
前i个是奇数个3,第i位必须取3(第i位有1个) 
(上面只是两种情况)
f[i][0]=f[i-1][0]*9+f[i-1][1];//因为第i位只有一个3 
f[i][1]=f[i-1][1]*9+f[i-1][0];
奇数+偶数的全体是n位数里面一共的数 
*/

总结:多提高思维能力,有的时候代码看起来很简单,但是思维过程是巨大的,但是也不要忘记提高码力,QAQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值