UVA 10635 王子和公主

2022-09-15 22:45:23 字數 1832 閱讀 9292

uva 10635

【題目描述】:王子和公主

乙個王子和公主在n*n的格仔中行走,這些格仔是有1....n^2的編號的。現在給定p+1個數,再給定q+1個數,公主和王子可以選擇其中某些格仔行走,求他們最多能走幾個相同的格仔。

【演算法分析】:

這道題讀題是關鍵,然後我們發現需要的是公共的格仔,又需要是這個步數最大化,可以想到最長公共子串行的模型。序列長度小於等於62500,最長公共子串行複雜度是n^2,超時,書上提供了把公共子串行退化到最長上公升子串行的方法。以第乙個系列為參照,編號1.....p+1,因為格仔的數字是不重複的,且最大編號是62500,空間上滿足。給第二個序列重新標號,求最長上公升子串行就可以了。**中的lis方法是nlg2(n)的。

【總結】:首先要知道這個退化模型的侷限性:1、數字不重複;2、標號小於等於62500(數字較小可儲存)。

解決第乙個問題:

舉例:      7 4 1 1 6 7 3

1 2 1 7 4 2 7

理想標號:  1 2 3 4 5 6 7

3 0 4 1 2 0 6

我們對每乙個重複的數字,例如1,在1這個節點上用map,把3,4的序列用vector按順序儲存即可,讀數的時候,按照從小到大的順序標號即可。因為標號本身是從小到大的,所以保證解的最大化。那麼到這裡,我們統一用map儲存好了,出現一次的數字,在vector中只有乙個元素。

解決第二個問題:

把大數統一用雜湊表儲存就可以了,同樣能滿足編號不重複。

【完整**】:

1 #include2

3 #include4

5 #include

67 #include8

9 #include10

11 #include12

13 #include14

15 #include16

17 #include18

19#define maxn 62500+10

2021

#define maxm 20000+5

2223

#define oo 9556531

2425

#define eps 0.000001

2627

#define pi acos(-1.0)//

這個精確度高一些

2829

#define rep1(i,n) for(int i=0;i<(n);i++)

3031

#define rep2(i,n) for(int i=1;i<=(n);i++)

3233

using

namespace

std;

3435

3637

inta[maxn];

3839

intb[maxn];

4041

int c[maxn];//

儲存轉化位置資訊

4243

int n,p,q,cas=0;44

45int

cnt;

4647

void

builtc()

4849

6061

intd[maxn],g[maxn];

6263

int lis(int a, int

n)64

6586

87delete b;

8889

return

ans;

9091}92

93//}94

95int

main()

9697

116117

return0;

118119 }

UVA 10635 J 最長上公升子串行

題意 給你長度為a 1與b 1的兩個數列,數列的數各不相同,並且只包含1 n n的數,求a與b的最長公共子串行。題解 由於兩個串最多長度都為250 250所以n n的最長公共子串行的做法不適合,但是我們可考慮,乙個數列中,所有的數字各不相同,所以我們可以通過將a陣列標記1 a 1,然後將b陣列通過a...

UVA 木塊問題 101

uva 木塊問題 101,好開森好開森。雖然花了很長時間,不過能一次就ac也是蠻開心的,用c 寫效率就是不錯 疊木塊其實是乙個二維空間,每個木塊都有縱橫座標 include include includeusing namespace std block用於記錄木塊所在位置,x是位於哪一疊木塊,y是...

UVA 非常可樂

include include include include include using namespace std struct node int vis 205 205 注意vis陣列用於 int s,n,m int cup left 3 記錄三個杯子中每個杯子的剩餘狀態 int bfs fo...