# 题目：

In an n×n chessboard, Prince and Princess plays a game. The squares in the chessboard are numbered 1, 2, 3, . . . , n∗n, as shown below:

Prince stands in square 1, make p jumps and finally reach square n ∗ n. He enters a square at most once. So if we use xp to denote the p-th square he enters, then x1, x2, . . . , xp+1 are all different. Note that x1 = 1 and xp+1 = n ∗ n. Princess does the similar thing – stands in square 1, make q jumps and finally reach square n ∗ n. We use y1, y2, . . . , yq+1 to denote the sequence, and all q + 1 numbers are different. Figure 2 belows show a 3×3 square, a possible route for Prince and a different route for Princess.

The Prince moves along the sequence: 1 –> 7 –> 5 –> 4 –> 8 –> 3 –> 9 (Black arrows), while the Princess moves along this sequence: 1 –> 4 –> 3 –> 5 > 6 –> 2 –> 8 –> 9 (White arrow). The King – their father, has just come. “Why move separately? You are brother and sister!” said the King, “Ignore some jumps and make sure that you’re always together.” For example, if the Prince ignores his 2nd, 3rd, 6th jump, he’ll follow the route: 1 –> 4 –> 8 –> 9. If the Princess ignores her 3rd, 4th, 5th, 6th jump, she’ll follow the same route: 1 –> 4 –> 8 –> 9, (The common route is shown in figure 3) thus satisfies the King, shown above. The King wants to know the longest route they can move together, could you tell him?

n×n的棋盘中，王子和公主玩游戏。棋盘上的方块编号

1 2 3 。 。 ，n ∗ n，如下所示：

x1 = 1且xp + 1 = n * n公主做类似的事情–站在广场1，使q跳，最终达到平方n ∗ n。我们使用y1，y2，。 。 。 ，yq + 1表示序列，并且所有q +1个数字均为不同。下面的图2显示了一个3×3的正方形，这是Prince的可能路线，而Princess的路线则不同。王子按照以下顺序移动：1 –> 7 –> 5 –> 4 –> 8 –> 3 –> 9（黑色箭头），而公主按照以下顺序移动：1 –> 4 –> 3 –> 5> 6 –> 2 –> 8 –> 9（白色箭头）。国王–他们的父亲，刚来。 “为什么要分开移动？你是兄弟姐妹！”国王说，“应该忽略一些跳跃，并确保您一直在一起。”例如，如果王子忽略了他的第二，第三，第六跳，他将遵循以下路线：1 –> 4 –> 8 –>9.如果公主不理her她的第三，第四，第五，第六跳，她将遵循相同的路线：1 –> 4 –> 8 –>9因此，如图9所示，通用路线如图3所示。国王想你知道他们可以一起走的最长路线，你能告诉他吗？

1

3 6 7

1 7 5 4 8 3 9

1 4 3 5 6 2 8 9

Case 1: 4

# 框架：

``` 1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 #include<algorithm>
5 #include<cmath>
6 using namespace std;//数组别小了
7 const int maxn=250*250+5,INF=0x3f3f3f3f;
8 int n,m,t,p,q,f[2][maxn],a[maxn],b[maxn];
10    int s=0,w=1;
11    char ch=getchar();
12    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)w=-1;ch=getchar();}
13    while(ch>=‘0‘&&ch<=‘9‘) s=s*10+ch-‘0‘,ch=getchar();
14    return s*w;
15 }//朴素的快读
16 int main(){
17     freopen("a.in","r",stdin);
19     int cnt=0;
20     while(++cnt<=t){
24         int maxmax=0;//听说register能省点时间
25         for(register int i=1;i<=n*n;i++){
26             f[0][i]=f[1][i]=a[i]=b[i]=0;
27         }
30         for(register int i=1;i<=p+1;i++){
31             int ans=0;//lcis模板，下篇博客详细介绍lcs和lcis
32             for(register int j=1;j<=q+1;j++){
33                 f[i%2][j]=f[(i-1)%2][j];//喜欢这样做滚动数组
34                 if(a[i]>b[j]&&ans<f[i%2][j])ans=f[i%2][j];
35                 if(a[i]==b[j])f[i%2][j]=ans+1;
36                 maxmax=max(maxmax,f[i%2][j]);
37             }//解释：因为lcis一定是从左或从上转移过来
38              //所以能用滚动数组节省时间空间
39         }
40         printf("Case %d: %d\n",cnt,maxmax);
41     }
42 }```

【线型DP】【LCIS】UVA_10635 Prince and Princess

(0)
(0)