uva1073 Glenbow Museum【解法二】

来源:互联网 发布:java中调用void方法 编辑:程序博客网 时间:2024/05/21 17:21

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 longconst 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());}
0 0
原创粉丝点击