傳送門
定義乙個陣列為good,當且僅當它能夠劃分為若干個這樣的子段(首元素等於區間長度-1 且 首元素》0)。求給出序列(長度1e3)中有多少個這樣的子串行%mod。
可能有點繞 上一下樣例。
輸入41
111輸出
7包括任取兩個,因為陣列[1,
1]中a[1]
=區間長度-1=
2-1=
1以及全選,因為111
1可以劃分為兩個陣列[1,
1]
很自然就想到在i處時可以再其後任取a[i]個(a[i]>0時),但是這只是單獨乙個的,很明顯兩個成立的子串行拼接起來依舊成立,在這裡就想斷了。
看了題解是乙個dp。
dp[j]表示位置j到結尾成立的序列數,那麼dp[i]=σc(j-i-1,a[i]-1)*(1+dp[j+1]),再加上dp[i+1]。即在位置i處到位置j處(確定首尾),再在區間中任取a[i]-1個,再拼接上dp[j+1]的答案,+1是因為可以不拼接。
這裡組合數用的比較頻繁,採取遞推預處理的方式。上**。
#include
using namespace std;
typedef
long
long ll;
typedef pair<
int,
int> pii;
typedef pair pll;
const
int maxn =
1e3+5;
const ll inf =
0x3f3f3f3f
;const ll mod =
998244353
;#define all(x) x.begin(), x.end()
int n;
ll a[maxn]
, dp[maxn]
, c[maxn]
[maxn]
;int
main()
}scanf
("%d"
,&n)
;for
(int i =
0; i < n;
++i)
scanf
("%lld"
, a + i)
;for
(int i = n -
1; i >=0;
--i)}}
printf
("%lld\n"
, dp[0]
);return0;
}
傳送門
題意就是兩個字串中選出k個不重疊的公共子串的最長長度和。
輸入912
4bbaaababb
abbbabbaaaba
輸出7
emmm,完全沒有思路。dp思想屬實不夠。
題解是這樣的dp,dp[i][j][k][0/1]表示s串到位置i,t串中到位置j時,已經有k個相同的子串,最後一位表示當前結尾是否為最後乙個子串的結尾(用於判斷能否接上)。有了這個定義應該就很容易轉移了。
搬一下別人的題解吧,我就不打了。
別人的題解
每日一練4
員工表emp 員工編號eid,姓名ename,工作職位title,僱傭日期hiretime,工資salary,獎金bonus,部門depart 部門表dept 部門編號did,名稱dname,部門領導leader 員工資料 1001,張三 銷售 1999 12 1 3000.0,1100.0,102...
每日一練25
請描述 mysql 從安裝到配置的全部詳細過程 確保一台新電腦可以順利使用 mysql mysql安裝嚮導啟動,按 next 繼續 選擇安裝型別,有 typical 預設 complete 完全 custom 使用者自定義 三個選項,我們選擇 custom 有更多的選項,也方便熟悉安裝過程 選擇配置...
每日一練 13
談談你對ajax 的理解?概念 特點 作用 select 教師號,sum case when 星期號 1 and 是否有課 有 then 1 else 0 end as 星期一,sum case when 星期號 2 and 是否有課 有 then 1 else 0 end as 星期二,sum c...