输入
一个整数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