[AHOI1997]彩旗飘飘

查看题目 Show Problem

[Donate]您的捐助,让RQNOJ明天更美好!

题目:[AHOI1997]彩旗飘飘

问题编号:371

题目描述

有n面红旗和n面黄旗从东到西插成一排。如果相邻的两面旗帜的颜色不同,则称为颜色发生一次改变。
任务:计算这2n面旗帜的颜色改变m次的插法共有多少种?
示例:
旗帜的颜色为“红黄红红黄黄黄”称为颜色改变了3次的插法。
在n=4,m=1时仅有两种插法:“红红红红黄黄黄黄”和“黄黄黄黄红红红红”,对应的输出为“2”。

输入格式

输入:从键盘上依闪输入自然数n和m。(n<15)

输出格式

输出:把插法总数在屏幕上显示输出。

样例输入

4 1

样例输出

2

 

f:array[0..15(红旗数),0..15(黄旗数),0..30(改变数),0..1(最后是黄旗[0]还是红旗[1])]of longint;

f[i,j,k,0]=f[i-1,j,k,1]+f[i-2,j,k,1]+f[i-3,j,k,1]+......+f[1,j,k,1];

例如

f[4,4,4,1]=

红红黄红红黄黄红+红黄红红红黄黄红+。。。。。。+@@@@@@@(f[3,4,4,0])+红

红红黄红红黄红红+。。。。。。+@@@@@@(f[2,4,4,1]=)红红+

。。。。。。+

@@@@红红红红

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
program Project1;
const max = 15 ;
var f: array [ 0 .. 15 , 0 .. 15 , 0 .. 30 , 0 .. 1 ] of longint;
n,m,i,j,k,l:longint;
begin
for i: = 1 to max do
for j: = 1 to max do
begin f[i,j, 1 , 0 ]: = 1 ;f[i,j, 1 , 1 ]: = 1 end ;
for k: = 2 to max * 2 do
for i: = 1 to max do
for j: = 1 to max do
begin
for l: = 1 to i do
inc(f[i,j,k,
0 ],f[i - l,j,k - 1 , 1 ]);
for l: = 1 to j do
inc(f[i,j,k,
1 ],f[i,j - l,k - 1 , 0 ]);
end ;
readln(n,m);
writeln(f[n,n,m,
0 ] + f[n,n,m, 1 ]);
end .

 

 

转载于:https://www.cnblogs.com/lixihan/archive/2010/09/17/1829604.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值