阿良良木曆將要迎來人生(不,是吸血鬼生涯)的第二次戰鬥——與身為人類和吸血鬼混血兒的艾比所特在直江津高中的操場solo,以取回heartunderblade的左腳。
艾比所特個子不大,卻單手扛著一副形狀比自己大三倍,重量是他體重乘三次方的巨大十字架。吸血鬼是怕十字架的,所以曆要遠遠地躲著。更麻煩的是艾比所特能變成霧氣,歷攻擊不到他,他卻因為是混血兒,吸血鬼的弱點降到了mininum,可以碰十字架。直到歷用沙子使艾比所特顯形,曆才獲得勝利。
可以把直江津高中的操場看成排成一條直線的n個點,其中第i個點位於數軸上的位置x[i]。如果從i跳到j,首先要花費時間|x[j]-x[i]|。假如i
這道題,題意很奇怪,字句間暗藏玄機。
我開始還以為是只用找乙個環,那麼就是值最大的尤拉迴路。
然後其實是可以有很多個簡單環的。
那麼就有乙個很顯然的性質
每個點的入度和出度只有1。
我們設f[i][j][k]表示做到第i個點,在1~i之間有j個點的還沒有出度,有k個點還沒有入度。
我們考慮從第i個點推向第i+1個點。
第一種情況:前i個點有乙個點連向第i+1個點,第i+1個點又連回來——>f[
i+1]
[j−1
][k−
1]=m
ax(f
[i+1
][j+
1][k
+1],
f[i]
[j][
k]+x
[i+1
]∗2+
a[i+
1]+c
[i+1
]);
第二種情況:前i個點有乙個點連向第i+1個點,第i+1個點往後面連——>f[
i+1]
[j][
k]=m
ax(f
[i+1
][j]
[k],
f[i]
[j][
k]+a
[i+1
]+d[
i+1]
);為什麼j和k沒有-1呢?因為推到i+1是又會多乙個點的,那麼影響j和k的點原本是又會多乙個,但是這裡會抵消乙個,上面的那種情況會抵消兩個。
第三種情況:第i+1個點連向前i個點的乙個點,i+1後面的點連向第i+1個點——>f[
i+1]
[j][
k]=m
ax(f
[i+1
][j]
[k],
f[i]
[j][
k]+b
[i+1
]+c[
i+1]
);第四種情況:i+1後面的點連向第i+1個點,第i+1個點又連向i+1後面的點——>f[
i+1]
[j+1
][k+
1]=m
ax(f
[i+1
][j+
1][k
+1],
f[i]
[j][
k]−x
[i+1
]∗2+
b[i+
1]+d
[i+1
]); 這種情況不會抵消。
注意邊界條件,前三種情況是在j>0||k>0的時候才能向後推的,因為都與i前面的點有關,前面的點用完了,自然不能連。
縮小空間
我們發現j和k都是同時加減的,所以三維可以合併為二維。
其實還可以繼續縮小,當然是滾動啦。
#include
#include
#include
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
#define rep(i,a) for(i=first[a];i;i=next[i])
using
namespace
std;
typedef
long
long ll;
const
int maxn=10007;
ll i,j,k,l,t,n,m,ans,da;
ll x[maxn],a[maxn],b[maxn],c[maxn],d[maxn],p,q;
ll f[2][maxn];
int main()
f[q][j+1]=max(f[q][j+1],f[p][j]-x[i+1]*2+b[i+1]+d[i+1]);
}p=p^1;
}printf("%lld\n",f[p][0]);
}
NOIP提高A組模擬 艾比所特
阿良良木曆將要迎來人生 不,是吸血鬼生涯 的第二次戰鬥 與身為人類和吸血鬼混血兒的艾比所特在直江津高中的操場solo,以取回heartunderblade的左腳。艾比所特個子不大,卻單手扛著一副形狀比自己大三倍,重量是他體重乘三次方的巨大十字架。吸血鬼是怕十字架的,所以曆要遠遠地躲著。更麻煩的是艾比...
NOIP模擬 修路
這題第一眼看上去有些懵逼,還以為是dp。第二眼,哦,這麼裸的最小生成樹,2分鐘打完,拍都沒對,自信100分。最終100分。每條邊的權值減去連個節點的權值,所有的邊做一次最小生成樹就好了。include include include include include define fo i,a,b f...
NOIP模擬 項鍊
經過一番周折,bob找到了alice,為了安慰alice驚魂未定的心,bob決定給alice買一條手鍊,這條手鍊由m個珍珠組成,每個珍珠上刻著不同的小寫字母。當alice看到一些字母按照一定的順序排列成的字串時,就會產生一定的愉悅值。bob現在可以在這m個珍珠上刻上字母,現在他想知道,如何刻字母可以...