POJ 1953 继续体会DP的内涵

本文介绍了一个动态规划问题,旨在计算N位二进制数中不含连续1的数的数量。通过构建状态转移方程opt[i]=opt[i-1]+opt[i-2],实现了高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题就是让你输出N位的二进制数中不包含两个连续的1的个数

DP瞬秒!!!

关键是找到DP方程

假设二进制序列为a1,a2,a3,........a(i-2),a(i-1),a(i)

opt[i]表示i位二进制数中符合上述特性的数字个数

则可得到opt[i]=opt[i-1]+opt[i-2]

因为,

如果a(i)为0,则,opt[i]=opt[i-1]

如果a(i)为1,那么a(i-1)一定为0,则,opt[i]=opt[i-2]

动态规划的题目关键就是找到合适的状态转移方程

#include<stdio.h> int opt[50]; int binary[10]; void decimal_to_binary(int value) { int _i; int cnt=0; while(value) { binary[cnt++]=value%2; value=value/2; } binary[cnt]=9;//indicate the num is end } int judge() { int _i; for(_i=1;binary[_i]!=9;_i++) { if(binary[_i-1]==1&&binary[_i]==1) return 0; } return 1; } int main() { int n; int cache; int i,j; int cnt=1; //freopen("input","r",stdin); opt[1]=2;opt[2]=3; for(i=3;i<46;i++) opt[i]=opt[i-1]+opt[i-2]; scanf("%d",&n); while(n--) { scanf("%d",&cache); printf("Scenario #%d:/n%d/n/n",cnt++,opt[cache]); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值