聖佐治:不用拘泥,剩下的時間已不多……
聖佐治:直呼我的真名——
絲佩碧雅:聖佐治大人
聖佐治:如今,已無法維持結界,或是抑制深淵的前進
聖佐治:既然如此,我將獻上這副身軀,期望最後的戰鬥
聖佐治:已經——應該沒有再和我多需說明的話語了
聖佐治:我也明白,我和其他4人都一樣,是沒有內在的傀儡——只不過是曾經存在的幻影罷了……
聖佐治:我本就是,身體被禁忌之龍的詛咒吞噬殆盡,幾乎半生不死的狀態……
聖佐治:曾經那個被稱作虹之聖佐治的男人已經死了
聖佐治:我除了消滅虛無的碎片,消滅那個魔女以外,已別無他望……
絲佩碧雅:我曾經愛過你,聖佐治大人——
美玲:快走,她由我來擋住!
美玲:你們快去打倒虹之聖佐治和莉澤洛特!
我的脊髓與頭被一分為二——
跌入黑暗的那一剎那——
我,呼喚著,他的名字——
聖佐治……大人……
為了朋友和明天——
我們是同伴……我這樣相信著
因為是同伴……所以相信你……
給你出了一道題:
給你乙個長為n的序列v,你可以從裡面選出最多m個數
有乙個數a,以及b個規則,每個規則即為:
對於這個序列的所有長為a的連續子區間,
如果這個子區間中對應的給出的x個位置都被選中了,
則這次選擇的分數加上y(y可能為負數,這種情況下分數仍然要加上y)
輸入格式:
第一行四個數n,m,a,b
之後一行n個數表示序列v
之後輸入b個規則
每個規則先輸入兩個數x和y,x != 0
之後一行x個數,分別表示這給定的x個位置
輸出格式:
一行乙個數表示最大可能得到的分數
輸入樣例#1:
5 3 3 1輸出樣例#1:2 3 3 3 3
2 233
1 3
474輸入樣例#2:
5 3 3 1輸出樣例#2:111 222 333 444 555
2 52
1 3
1384輸入樣例#3:
6 3 3 2輸出樣例#3:1 2 3 3 4 1
2 11 2
2 22 3
16樣例#4,#5,#6見下發的檔案
【子任務】
子任務會給出部分測試資料的特點。
如果你在解決題目中遇到了困難, 可以嘗試只解決一部分測試資料。
每個測試點的資料規模及特點如下表:
測試點編號
n的範圍
m的範圍
a的範圍
b的範圍
測試點1
n <= 20
m <= 20
a <= 10
b <= 5
測試點2
n <= 20
m <= 20
a <= 10
b <= 5
測試點3
n <= 40
m <= 40
a <= 10
b <= 100000
測試點4
n <= 40
m <= 40
a <= 10
b <= 100000
測試點5
n <= 100
m <= 50
a <= 10
b = 0
測試點6
n <= 100
m <= 50
a <= 10
b = 0
測試點7
n <= 100
m <= 50
a <= 10
b <= 100000
測試點8
n <= 100
m <= 50
a <= 10
b <= 100000
測試點9
n <= 100
m <= 50
a <= 16
b <= 100000
測試點10
n <= 100
m <= 50
a <= 16
b <= 100000
對於100%的資料,n <= 100 , m <= 50 ,a <= 16 , b <= 100000 , 序列中每個值以及每條規則帶來的加分的絕對值 <= 100
【說明】
【樣例1說明】
【樣例2說明】
【樣例3說明】
分析:一開始想著貪心,但是貪不出來.仔細觀察題目就會發現,這其實就是狀壓dp.因為a <= 16,我們可以狀壓a.先預處理出每個狀態的貢獻值.設f[i][j][k]為前i個數中選了j個末尾a個的狀態為k的分數,列舉i-1位置上末尾a個的狀態s,那麼當前如果不考慮第i位的狀態t就是(s << 1) & ((1 << a) - 1).如果第i位不選,那麼f[i][j][t] = max,p是預處理出的每個狀態的貢獻值,如果第i位要選,那麼f[i][j][t | 1] = max
因為i是從i-1轉移過來的,所以可以用滾動陣列優化一下.
#include #include#include
#include
using
namespace
std;
int n, m, a, b, v[110], c[(1
<< 16) + 10], p[(1
<< 16) + 10
];int f[55][(1
<< 16) + 10], now, last, ans, g[55][(1
<< 16) + 10
];int
main()
c[stu] +=y;
}for (int i = 0; i < (1
<< a); i++)
for (int j = i; j; j = (j - 1) &i)
p[i] +=c[j];
memset(f, -0x3f, sizeof
(f));
memset(g, -0x3f, sizeof
(g));
f[0][0] = 0
;
int zhuangtai = (1
<< a) - 1
;
for (int i = 1; i <= n; i++, swap(f, g), memset(g, -0x3f, sizeof
(g)))
for (int j = 0; j <= min(m, i); j++)
for (int s = 0; s <= zhuangtai; s++)
if (f[j][s] != -1044266559
)
for (int i = 0; i <= m; i++)
for (int j = 0; j < (1
<< a); j++)
ans =max(ans, f[i][j]);
printf(
"%d\n
", ans);
return0;
}
noip模擬賽 終末
分析 舉個例子就能發現 偶數字上的數都必須是0,奇數字上的數可以取0 k 1,這就是乙個標準的數字dp了.這編譯器.陣列越界了竟然不報錯.include include include include using namespace std typedef long long ll ll n,k,s...
noip模擬賽 密碼
表示沒看懂演算法3 問題描述 有壓迫,就有反抗。mored的寵物在法庭的幫助下終於反抗了。作為乙隻聰明的寵物,他打算把魔法使mored的魔法書盜去,奪取mored的魔法能力。但mored怎麼會讓自己的魔法書輕易地被盜取?mored在魔法書上設定了乙個密碼鎖,密碼鎖上有乙個問題。施以斯臥鋪魔法吧,你有...
NOIP模擬賽 老師
題目描述 一座有n層的教學樓裡有一些學生,第i 0 i n 層有studentsi個學生。你被給定了乙個數k,如果第i層有x個學生,那麼這一層需要 x k 個老師。你可以調整每個學生的樓層,但是每個學生至多只能調整一層,就是說第i層的學生只能去第i 1層 如果有的話 第i層 第i 1層 如果i 1 ...