題解:本題求最長下降子串行,然後求最長下降子串行的個數,並且不能重複。這就尷尬了……
才發現,我竟然只會前一半……
最近瘋狂刷dp,還是有一些成效的,至少可以寫出乙個靠譜點的動態轉移方程了,
設g[i]代表當到第i個數時,長度最長的最長下降子串行個數。
得出 g[i]=sum(g[j]) (f[j]+1=f[i])
若g[i]==0就g[i]=1
於是: wa 82%
#include
int n;
int num[5003];
int f[5003];
int g[5003];
int main()
f[1]=1;
g[1]=1;
for(int i=2;i<=n;i++)
else
if(f[j]+1==f[i])}}
}int max=0;
int sum=0;
for(int i=1;i<=n;i++)
}printf("%d
%d\n",max,sum);
return
0;}
看了看題,發現有一句話沒有注意:「在計算解的數量的時候,如果兩個解所組成的字串相同,那麼這樣的兩個解被認為是相同的(只能算做乙個解)。因此,兩個不同的購買方案可能產生同乙個字串,這樣只能計算一次。」
於是,我冥思苦想,終於還是沒想出來,就看了題解:
如果有兩個方案中出現序列一樣,視為乙個方案,要需要加乙個陣列next 用next[i] 記錄和第i個數情況一樣(即:f[i]=f[j] 且 num[i]=num[j])可看做乙個方案的最近的位置。
為了方便操作可以將num[n+1]賦值為-1這樣可以認為第n+1 個一定可以買,答案就是f[n+1] g[n+1]
於是:寫了這個,wa 27%
#include
#include
int n;
int num[5003];
int f[5003];
int g[5003];
intnext[5003];
int v[5003];
int main()
n++;
num[n]=-1;
f[1]=1;
for(int i=2;i<=n;i++)}}
}for(int i=1;i<=n;i++)}}
g[1]=1;
for(int i=2;i<=n;i++)
v[x]=1;
if(num[x]>num[i]&&f[x]+1==f[i]) g[i]+=g[x];
}if(!g[i]) g[i]=1;
}printf("%d
%d\n",f[n]-1,g[n]);
return
0;}
改用long long wa 9%
看題解發現需要高精度,不想寫了
#include
long
long n;
long
long num[5003];
long
long f[5003];
long
long g[5003];
long
long next[5003];
long
long v[5003];
int main()
n++;
num[n]=-1;
f[1]=1;
for(long
long i=2;i<=n;i++)}}
}for(long
long i=1;i<=n;i++)}}
g[1]=1;
for(long
long i=2;i<=n;i++)
v[x]=1;
if(num[x]>num[i]&&f[x]+1==f[i]) g[i]+=g[x];
}if(!g[i]) g[i]=1;
}printf("%lld %lld\n",f[n]-1,g[n]);
return0;}
/*65 6 4 3 1 2
*/
至強5500生逢其時
每年至少會來中國三次的英特爾公司數字企業事業部副總裁兼總經理唐克銳,在最近一次訪問北京時又給中國的 帶來了關於至強5500系列產品的好訊息。英特爾於2009年第二季度推出了至強5500系列,到第三季度中期,其產品出貨量已經超過了上一代產品。我們擁有多樣化的產品,能夠滿足不同企業,包括高效能計算使用者...
人逢英雄精神爽
5號沒來成北京,因為要在武漢和外方談合作,外方的時間都是去年預訂好了的。很可惜沒能在5號的晚上與眾多英雄碰杯。6號上午,在忙碌擁擠的車流中終於到了會場,這邊已經是人聲鼎沸,英雄端底是層出不窮了 乙個接乙個地從屋裡往外冒,真格是叫偶的眼睛不夠看的。剛和這位打完招呼,那邊又過來幾個朋友,還不斷有人發來簡...
絕渡逢舟系列題解
題目大意 按順時針或逆時針給定凸包上的n個點,隨機選取內部或邊上的整點,求兩點為正方形對角線的正方形面積的期望題解有 sum 個合法點 內部或邊上 那麼面積的期望為 an s 12 sum i 1 sumj 1 x i xj 2 yi y j 2n n 1 對於分子x和 y是同一 形式所以我們只看 ...