luoguP2267 琪琪的項鍊

2022-05-12 01:58:06 字數 1349 閱讀 5076

題目:

題解:這題略吊。

看了之後發現不能用組合數學直接得出公式,然後如果直接暴力也不知道如何去排除兩個顏色序列相同的情況。

然後去膜拜題解

令f[i]表示結尾 i 必選的diy方法的種數。所有珠子顏色不一樣的話:f[i] = f[0] + f[1] + ... + f[i-1] 

對於顏色不同的話,假設珠子i顏色為c,顏色c在i之前出現的位置為j,那麼在式子:f[i] = f[0] + f[1] + ... + f[i-1] 中,我們多算了f[0] + f[1] + ... + f[j-1]。

所以對於此時的f[i] = f[j] + ... +f[i-1],最後 ans = sum(f[i] , 1 <= i <= n)。

說到這裡應該就很明顯了,搞個字首和就行了。

這種與顏色序列有關的題貌似記錄一下該顏色上一次出現的位置是個不錯的想法?@hh的項鍊 @採花

**:

1 #include2 #include3 #include4 #include5 #include6 #include

7 #include

8 #include9 #include10 #include11 #include12

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

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

14#define for2(i,x,y) for(int i=(x);i<=(y);i++)

15#define for3(i,y,x) for(int i=(y);i>=(x);i--)

16#define maxn 500000+100

17using

namespace

std;

18 inline int

read()

1922

while(ch>='

0'&&ch<='9')

23return x*f;

24}

25int

n,m,tot,f[maxn],g[maxn],a[maxn],b[maxn],c[maxn],pre[maxn],head[maxn];

26 inline bool cmp(int x,int y)

27int

main()

2839

for1(i,n)

4043 g[0]=f[0]=1;44

for1(i,n)

4549 printf("

%d\n

",g[n]-1

);50

return0;

51 }

view code

luogu P2267 琪琪的項鍊

恢復內容開始 神仙題。第一眼還以為是道數學題。看了題解發現是道噁心的dp。設 f i 表示 以珠子 i 為結尾的方案數 必須選i 然後能對其做出貢獻的只有 x i 1 這段區間。x表示 a x a i a x 1 i 1 a i 也就是最後乙個和 i 顏色相同的位置。為什麼?因為在1 x 1中選出若...

JZ初中OJ 2267 寶物篩選

時間限制 1000 ms 空間限制 60000 kb 具體限制 題目描述 終於,破解了千年的難題。小 ff 找到了王室的寶物室,裡面堆滿了無數價值連城的寶物 這下小 ff 可發財了,嘎嘎。但是這裡的寶物實在是太多了,小ff 的採集車似乎裝不下那麼多寶物。看來小 ff 只能含淚捨棄其中的一部分寶物了 ...

Luogu P1208 混合牛奶

這個題目直接開個結構體按 排序,然後一直加加加,就可以了。典型的貪心。include include include include include include using namespace std int i,m,n,j,k,ans struct mana 5001 bool cmp man...