hdu 2563 统计问题
2016-07-09 15:51
155 查看
递推题一般比较容易做,都是根据前面几个状态来推断当前状态。这道题可以从前面状态横走跟直走的数量来推断现态。用l[i]记录当前状态下最后一步是直走的路径数,用h[i]记录当前最后一步是横走的路径数,用sum[i]记录总的路径数,即sum[i] = h[i] + l[i];
重点在h[i]跟l[i]怎么递推而来。
这个比较容易。
如果当前最后一步是直走,那么下一步可以直走或是横走两个方向。
如果当前最后一步是横走,那么下一步只能直走或是横走一个方向。
由此可得
不管i-1怎么走,第i步总能直走 所以 l[i] = sum[i -1];
i - 1步直走的时候,第i步可以有两个横走,i- 1步横走的时候,第i步只有一个横走。故h[i] = h[i-1] + l[i-1] * 2;
#include<stdio.h>
int sum[32]
= {0, 3, 7};
int h[32]
= {0, 2, 4};
int l[32]
= {0, 1, 3};
int main()
{
int T, n, i;
scanf("%d",
&T);
for( i = 3 ; i < 31 ; i++)
{
l[i] = sum[i-1];
h[i] = h[i-1]
+ l[i-1]
* 2;
sum[i] = h[i]
+ l[i];
}
while(T--)
{
scanf("%d",
&n);
printf("%d\n", sum[n]);
}
return 0;
}
重点在h[i]跟l[i]怎么递推而来。
这个比较容易。
如果当前最后一步是直走,那么下一步可以直走或是横走两个方向。
如果当前最后一步是横走,那么下一步只能直走或是横走一个方向。
由此可得
不管i-1怎么走,第i步总能直走 所以 l[i] = sum[i -1];
i - 1步直走的时候,第i步可以有两个横走,i- 1步横走的时候,第i步只有一个横走。故h[i] = h[i-1] + l[i-1] * 2;
#include<stdio.h>
int sum[32]
= {0, 3, 7};
int h[32]
= {0, 2, 4};
int l[32]
= {0, 1, 3};
int main()
{
int T, n, i;
scanf("%d",
&T);
for( i = 3 ; i < 31 ; i++)
{
l[i] = sum[i-1];
h[i] = h[i-1]
+ l[i-1]
* 2;
sum[i] = h[i]
+ l[i];
}
while(T--)
{
scanf("%d",
&n);
printf("%d\n", sum[n]);
}
return 0;
}
相关文章推荐
- 经典排序算法--插入排序 希尔排序 归并排序
- iOS常用公共方法
- jQuery回到顶部的代码
- STL--C++中 destory() 和deallocate()以及delete函数的相关性和区别性,destorydeallocate
- path
- C&C++学习笔记2
- 小京东版权修改
- 直观解释Gamma分布和Poisson分布
- 详解 Spotlight on MySQL监控MySQL服务器
- codeforces 689D D. Friends and Subsequences(RMQ+二分)
- javascript之location对象
- 开发 - kafka的一次小坑
- poj3253
- 响应式布局总结
- merge into和on duplicate key
- gcc 编译过程
- 风口的猪-中国牛市(小米2016校招)
- Android进程间通信之--Socket
- 腾讯-字符移位
- 推荐几个文档工具