uva1073 Glenbow Museum【解法二】

这篇博客讨论了卡尔加里著名的Glenbow博物馆新馆的规划,新馆将展示杰出的计算机程序员。由于空间限制,需要新建建筑并迁移。新旧建筑的平面图都是正交多边形。博客探讨了如何用角度字符串描述这些多边形,并定义了有效的正交多边形——即能由一名警卫守卫的多边形。作者提出了动态规划的解决方案来计算给定长度下有多少个接受的角字符串。
摘要由CSDN通过智能技术生成

The famous Glenbow Museum in Calgary is Western Canada’s largest
museum, with exhibits ranging from art to cultural history to
mineralogy. A brand new section is being planned, devoted to brilliant
computer programmers just like you. Unfortunately, due to lack of
space, the museum is going to have to build a brand new building and
relocate into it. The size and capacity of the new building differ
from those of the original building. But the oor plans of both
buildings are orthogonal polygons. An orthogonal polygon is a polygon
whose internal angles are either 90 or 270. If 90 angles are denoted
as R (Right) and 270 angles are denoted as O (Ob- tuse) then a string
containing only R and O can roughly describe an orthogonal polygon.
For example, a rectangle (Figure 1) is the simplest orthogonal polygon
and it can be described as RRRR (the angles are listed in
counter-clockwise order, starting from any corner). Similarly, a
cross-shaped orthogonal polygon (Figure 2) can be described by the
sequence RRORRORRORRO, RORRORRORROR, or ORRORRORRORR. These sequences
are called angle strings . Of course, an angle string does not
completely specify the shape of a polygon | it says nothing about the
length of the sides. And some angle strings cannot possibly describe
a valid orthogonal polygon (RRROR, for example). To complicate things
further, not all orthogonal polygons are acceptable oor plans for the
mu- seum. A museum contains many valuable objects, and these objects
must be guarded. Due to cost considerations, no oor can have more
than one guard. So a oor plan is acceptable only if there is a place
within the oor from which one guard can see the entire oor.
Similarly, an angle string is acceptable only if it describes at least
one acceptable polygon. Note that the cross-shaped polygon in Figure 2
can be guarded by someone standing in the center, so it is acceptable.
Thus the angle string RRORRORRORRO is acceptable, even though it also
describes other polygons that cannot be properly guarded by a single
guard. Help the designers of the new building determine how many
acceptable angle strings there are of a given length. Input The input
le contains several test cases. Each test case consists of a line
containing a positive integer L (1 L 1000), which is the desired
length of an angle string. The input will end with a line containing
a single zero. Output For each test case, print a line containing the
test case number (beginning with 1) followed by the number of
acceptable angle strings of the given length. Follow the format of the
sample output.

解法一见【这里】
用dp[i][j][k]表示有i个R,有j个相邻的R,第一个元素是k,最后一个元素是R的方案数,枚举在后面接上OR或者R。
答案是dp[(n+4)/2][3][0]+dp[(n+4)/2][4][1]+dp[(n+4)/2][4][0],其中最后一项表示R开头O结尾的情况【去掉最后一个O,一定是以R结尾】。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
const int c=3;
int n;
LL dp[1010][8][2];
LL solve()
{
    int i,j;
    if ((n&1)||n<4) return 0;
    memset(dp,0,sizeof(dp));
    dp[1][0][0]=dp[1][0][1]=1;
    for (i=2;i<=(n+4)/2;i++)
        for (j=0;j<=4;j++)
        {
            dp[i][j][0]=dp[i-1][j][0];
            if (j) dp[i][j][0]+=dp[i-1][j-1][0];
            dp[i][j][1]=dp[i-1][j][1];
            if (j) dp[i][j][1]+=dp[i-1][j-1][1];
        }
    return dp[(n+4)/2][3][0]+dp[(n+4)/2][4][1]+dp[(n+4)/2][4][0];
}
int main()
{
    int K=0;
    while (scanf("%d",&n)&&n)
        printf("Case %d: %lld\n",++K,solve());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值