【牛客 - 373B】666RPG(线性计数dp)
題干:
鏈接:https://ac.nowcoder.com/acm/contest/373/B
來源:牛客網
在歐美,“666”是個令人極其厭惡和忌諱的數,被稱為“野獸數”。
相傳,尼祿,這位歷史上以暴君著稱的古羅馬皇帝,在一次羅馬大火后,無端指控是基督徒焚燒了羅馬,并對他們進行大肆鎮壓。尼祿死后,部分基督徒出于對尼祿的恐懼,相信他并沒有死去,而且還會回到羅馬來。圣經《新約·啟示錄》中說,有一頭野獸“因傷致死,但是它的致命傷又治好了”。“你所看見的獸先前有,如今沒有,將要從無底坑里上來……可以計算野獸的數目,他的數目是六百六十六。” 基督徒把“666”稱為“野獸數”,相信尼祿就是復活的野獸。
關于“野獸數666”有許多趣聞。比如:
美國前總統里根在其離任前,曾打算退休后移居貝萊爾市克勞德大街666號別墅,然而當他得知這一邪惡的門牌號時,頓時大驚失色。
無獨有偶,在尼克松當政時,國務卿基辛格博士也碰上了“666”的調侃。美國著名數學科普作家馬丁·加德納在其名著《不可思議的矩陣博士》中,采用以代碼數字替換英文字母的方式,把26個英文字母變成一個以6為首項、公差為6的等差數列:
A(6),B(12),C(18),D(24),E(30),F(36),G(42),H(48),I(54), J(60),K(66),L(72),M(78),N(84),O(90),P(96),Q(102),R(108),S(114),T(120),U(126),V(132),W(138),X(144),Y(150),Z(156)。
然后,把基辛格(Kissinger)的姓氏字母,變換為代碼數字求和:66+54+114+114+54+84+42+30+108=666,正好是個“野獸數”。
以前對希特勒和墨索里尼也進行過類似的計算。并且,經過一些有心人的“考證”,許多壞事、惡事都與“野獸數666”有關。比如,“666”就正好是賭場輪盤上數字的和。所以,西方人甚至不少名流、學者都對“野獸數666”諱莫如深。
?
不過在數學上,666的確有許多奇妙之處。如:
?1、666是前七個素數的平方和??22+32+52+72+112+132+172=666?22+32+52+72+112+132+172=666
?2、?(6+6+6)+(63+63+63)=666?(6+6+6)+(63+63+63)=666。
?3、?(6+6+6)+2×(6+6+6)2=666?(6+6+6)+2×(6+6+6)2=666。
?4、?13+23+33+43+53+63+53+43+33+23+13=666?13+23+33+43+53+63+53+43+33+23+13=666。
?---廢話到此為止?
?
lililalala正在玩一種有?N?N個回合的回合制RPG游戲,初始分數為0,第?i?i個回合lililalala有如下兩種選擇。
??? A.將分數加上?ai?ai
??? B.將分數?×-1?×-1
lililalala同樣也很討厭野獸數?666?666,但是他很卻喜歡數字?-666?-666。他想知道有多少種不同的方案使得?N?N個回合后分數變為?-666?-666且在任何一個回合之后分數都不為?666?666。
如果兩種方案有任何一個回合選擇不同,就認為這兩種方案是不同的。
答案請對?108+7?108+7取模。
輸入描述:
?輸入包含兩行。
第一行一個整數?N(1≤N≤300)?N(1≤N≤300)。
第二行?N?N個整數?a1a2a3...an(-666≤?a1a2a3...an≤666)?a1a2a3...an(-666≤?a1a2a3...an≤666)。
輸出描述:
輸出一行一個整數--符合條件的不同方案數。示例1
輸入
復制
3 -333 -333 -333輸出
復制
1說明
?僅一種符合條件的方案
第一回合選擇將分數?×?1?×?1。分數為?0?0
第二回合選擇將分數加上?-333?-333。分數為?-333?-333
第三回合選擇將分數加上?-333?-333。分數為?-666?-666
示例2
輸入
復制
3 333 333 333輸出
復制
0示例3
輸入
復制
13 518 -643 -503 424 -76 -18 547 26 51 -647 -457 -5 329輸出
復制
2題目大意:
? ?給定n個數,n個回合,第i個回合可以有兩種選擇:將當前分數*-1,或將當前分數+= a[i]
解題報告:
? ?dp[i][j]代表前i個回合,分數到達j的方案數。注意到可能有負數,平移一個長度zero。又注意到可能會超內存,滾動數組優化一下。如果遇到==666的,就不轉移,就好了。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair using namespace std; const double PI = acos(-1.0); const int MAX = 2e5 + 5; int n; int a[MAX]; ll dp[2][105555]; const ll mod = 1e8+7 ; const int zero = 50000; int main() {cin>>n;int sum = 0;for(int i = 1; i<=n; i++) cin>>a[i];dp[0][0+zero] = 1;int flag = 0;for(int i = 1; i<=n; i++) {flag ^=1;for(int j = -40000; j<=40000; j++) {if(j == 666) continue;dp[flag][j+zero] += dp[flag^1][-j+zero];dp[flag][j+zero] += dp[flag^1][j-a[i]+zero];dp[flag][j+zero] %= mod;}memset(dp[flag^1],0,sizeof dp[flag^1]);} printf("%lld\n",dp[flag][-666 + zero]);return 0 ;}?
總結
以上是生活随笔為你收集整理的【牛客 - 373B】666RPG(线性计数dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读取慢了50%!曝苹果M2版MacBoo
- 下一篇: ACM所有算法大全(持续更新)