1. 程式人生 > >泥點spot

泥點spot

重疊 一個數 內存 [0 一個 開始 範圍 code 爆炸

Spot
描述
有n個泥點,排成一排,第i個泥點坐標為ai。有m個木板,第i個木板長為li。現在用盡可能少的木板覆蓋所有泥點。
問:使用木板的最少數量以及最優方案數(mod 1000000007),若不能完全覆蓋,請輸出“NO”。
註意:
泥點可重復覆蓋,木板可重疊。
計算方案時,長度相等的兩個板不等價,視為兩種板。
輸入
第1行:一個數n
第2行:n個數a1,a2…an(從小到大給出)
第3行:一個數m
第4行:m個數l1,l2…ln
輸出
第1行,一個數,使用木板的最少數量
第2行,一個數,最優方案數
若不能完全覆蓋,請輸出“NO”
樣例輸入
1
0
1
10
樣例輸出
1
10
數據範圍和約定
對於20%的數據:n=1
對於另外20%的數據:m=1
對於100%的數據:
1<=n,m<=15
0<=ai<=1000000000
1<=li<=1000000000
時空限定
內存限制為 512 MB
時間限制為 1 s
評測環境和細則
評測開啟-O2優化
評測軟件為lemon
評測忽略行尾空格
文件名
提交文件名為spot.cpp/pas
輸入文件名為spot.in
輸出文件名為spot.out

n,m<=15,先確定是狀壓

一開始f[i][j],i表示前i個木板,j壓的是泥點
再用g[i][j] 在dp的時候記錄方案數
但是要考慮的情況會多到爆炸
在卡了一個下午後,本蒟蒻毅然決然的決定 換!狀!態!!!!

用f[i][j],i表示前i個泥點,j壓的是木板,f[i][j]表示方案數
初始化成負數
最後再掃一遍f[n][0-maxp],找不是負數中最小的,沒找著就輸出”NO”
這樣比以前的好處是:
泥點最後一定要全都選完,但木板不一定,比較好轉移。

錯誤的第一次code

泥點spot