递推与动态规划
递推解决的问题中满足最优化原理的也是属于动态规划范畴
1313:位数问题
在所有的N(<1000)位数中,有多少个数中有偶数个数字3?由于结果可能很大,你只需要输出这个答案对12345取余的值。
f[i][0]表示前i位中含偶数个3(含0个)的数的数量
f[i][1]表示前i位中含奇数个3(含0个)的数的数量
每增加一位数字, f[i][0]=f[i-1][0]*9+f[i-1][1] ,f[i][1]=(f[i-1][1]*9+f[i-1][0])
int f[1005][2];
int main(){
int i,n;
cin>>n;
if(n==1)f[1][0]=9;
else f[1][0]=8;
f[1][1]=1;
for(i=2;i<=n;i++){
f[i][0]=(f[i-1][0]*9%12345+f[i-1][1])%12345;
f[i][1]=(f[i-1][1]*9%12345+f[i-1][0])%12345;
}
cout<<f[n][0];
return 0;
}
1314:过河卒
f[i][j]表示走到i,j这个点的路径条数,只能从上方和左边走到这一点,因此
递推式或者动态规划转移方程式:f[i][j]=f[i-1][j]+f[i][j-1];
为了处理方便,n、m等都增加1,相当于在棋盘外面多套了一圈儿ÿ