1. 程式人生 > >【dp-有針對性設計方案】LOJ2538 [PKUWC2018] Slay the Spire

【dp-有針對性設計方案】LOJ2538 [PKUWC2018] Slay the Spire

【題目】
原題地址
題目大意見原題

【解題思路】
首先可以發現我們一定是能用加強就先加強。然後加強和攻擊一定是從大到小打的。
我們記 m m 張卡中強化有 i i 張,則當 i

< k i<k ,打 i i 張強化和 k
i k-i
張攻擊,當 i k 1 i\geq k-1
,打 k 1 k-1 張強化和 1 1 張攻擊。
我們記 F ( i , j ) F(i,j) 為選 i i 張強化,打出 j j 張,所有方案翻倍的倍率和, G ( i , j ) G(i,j) 為選 i i 張攻擊,所有方案造成傷害和,那麼上面的兩種情況實際上分別對應 F ( i , i ) × G ( m i , k i ) F(i,i)\times G(m-i,k-i) F ( i , k 1 ) × G ( m i , 1 ) F(i,k-1)\times G(m-i,1) (由乘法分配律可知是對的)
我們現在要求的就是這兩個陣列。
f ( i , j ) f(i,j) 為用了 i i 張強化,最後一張是第 j j 張所有方案倍率的和, g ( i , j ) g(i,j) 類似,那麼:
f ( i , j ) = w j × p < j f ( i 1 , p ) f(i,j)=w_j\times \sum_{p<j}f(i-1,p)
g ( i , j ) = w j × ( j 1 i 1 ) + p < j g ( i 1 , p ) g(i,j)=w_j\times {j-1\choose i-1}+\sum_{p<j}g(i-1,p)
其中 g g 的轉移要乘上組合數是因為它會貢獻個若干個方案,而不是一個,而 f f 的貢獻實際上就是乘上了一個數。
那麼最終我們可以得到 F F G G
F ( x , y ) = i = 1 n f ( y , i ) × ( n i x y ) F(x,y)=\sum_{i=1}^n f(y,i)\times {n-i \choose x-y}
G ( x , y ) = i = 1 n g ( y , i ) × ( n i x y ) G(x,y)=\sum_{i=1}^n g(y,i)\times {n-i \choose x-y}
特別地,對於 y = 0 y=0 F ( x , y ) = ( n x ) F(x,y)={n\choose x}

【參考程式碼】

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=3005,mod=998244353;
int n,m,K,ans;
int lup[N],atk[N],sum[N];
int f[N][N],g[N][N],c[N][N];

int read()
{
	int ret=0;char c=getchar();
	while(!isdigit(c)) c=getchar();
	while(isdigit(c)) ret=ret*10+(c^48),c=getchar();
	return ret;
}

int C(int x,int y){if(y>x)return 0;return c[x][y];}
int mul(int x,int y){return (ll)x*y%mod;}
int upm(int x){return x>=mod?x-mod:x;}
void up(int &x,int y){x+=y;if(x>=mod)x-=mod;}

void init()
{
	for(int i=0;i<N;++i) 
	{
		c[i][0]=c[i][i]=1;
		for(int j=1;j<i;++j) c[i][j]=upm(c[i-1][j]+c[i-1][j-1]);
	}
}

int getf(int x,int y)
{
	if(x<y) return 0; if(!y) return c[n][x];
	int ret=0;
	for(int i=1;i<=n;++i) up(ret,mul(f[y][i],C(n-i,x-y)));
	return ret;
}

int getg(int x,int y)
{
	if(x<y || !y) return 0; 
	int ret=0;
	for(int i=1;i<=n;++i) up(ret,mul(g[y][i],C(n-i,x-y)));
	return ret;
}

bool cmp(int x,int y){return x>y;}

int main()
{
#ifndef ONLINE_JUDGE
	freopen("LOJ2538.in","r",stdin);
	freopen("LOJ2538.out","w",stdout);
#endif
	init();
	int T=read();
	while(T--)
	{
		n=read();m=read();K=read();
		for(int i=1;i<=n;++i) lup[i]=read();
		for(int i=1;i<=n;++i) atk[i]=read();
		sort(lup+1,lup+n+1,cmp);sort(atk+1,atk+n+1,cmp);

		sum[0]=0;
		for(int i=1;i<=n;++i)
		{
			if(i==1) 
			{
				for(int j=1;j<=n;++j) f[i][j]=lup[j];
				for(int j=1;j<=n;++j) sum[j]=upm(sum[j-1]+f[i][j]);
				continue;
			}
			for
            
           

相關推薦

dp-針對性設計方案LOJ2538 [PKUWC2018] Slay the Spire

【題目】 原題地址 題目大意見原題 【解題思路】 首先可以發現我們一定是能用加強就先加強。然後加強和攻擊一定是從大到小打的。 我們記 m m

LOJ2538 PKUWC2018 Slay the Spire DP

tps strong 合數 size ont 傳送門 int 攻擊 前綴 傳送門 不想放題面了,咕咕咕咕咕 這個期望明明是用來嚇人的,其實要算的就是所有方案的最多傷害的和。 首先可以知道的是,能出強化牌就出強化牌(當然最後要留一張攻擊牌出出去),且數字盡量大 所以說在

[LOJ2538][PKUWC2018]Slay the Spire(DP)

https://blog.csdn.net/maxwei_wzj/article/details/80789619 感覺主要難在想到通過f,g來求F,G。 程式碼實現調換了題解中f,g的兩維。 1 #include<cstdio> 2 #include<cstring>

高並發解決方案5、如何設計一個秒殺系統

電商 進程 atom 統架構 多用戶 能力 如果能 後臺 寫鎖 https://www.cnblogs.com/wangzhongqiu/p/6557596.html 什麽是秒殺 秒殺場景一般會在電商網站舉行一些活動或者節假日在12306網站上搶票時遇到。對於電商網站中

小程序碼 - 設計菊花綻放

comm 為我 實際應用 版本 設定 解碼 能力 處理 讓我 作者:lincolnlin,endyxu,changoran 2017 年四月,微信正式推出了小程序碼。小程序碼的使命及誕生的過程, 掃碼背後藏了什麽秘密?小程序碼又為何長得像菊花? | 你問鵝答 一文已經作過

python可視化方案pyecharts + Django 框架

iss 處理 解決 char -a 配置 template 使用 ubun 背景:基於對於可視化的巨大需求以及成本因素,利用pyecharts + Django 的可視化方式,顯然是一種比較優的選擇 通過可視化可尋找:模式、關系和異常 環境:強迫癥患者,歷來都是用最新版本

LOJ2538. 「PKUWC2018Slay the Spire組合數學

LINK 思路 首先因為式子後面把方案數乘上了 所以其實只用輸出所有方案的攻擊力總和 然後很顯然可以用強化牌就儘量用 因為每次強化至少把下面的牌翻一倍,肯定是更優的 然後就只有兩種情況 強化牌數量少於k 強化牌數量大於等於k 根據乘法原理,設\(f_{i,j}\)是選i張強化

DP、線段樹優化琪露諾

跟去年(2017)PJ第四題幾乎是一樣的?/吐血 DP方程可以很簡單的推出來,f[i]=max{f[k]}+a[i] 然而這樣做是O(n^2)的 看一下資料,200000的話要不nlogn 要不n 由於題解裡面單調佇列和優先佇列都有人用了,那就來一發線段樹吧 (或者實情是:單調佇列不會打?) 只要維護i-r~

高併發簡單解決方案redis快取佇列+mysql 批量入庫+php離線整合

需求背景:有個呼叫統計日誌儲存和統計需求,要求儲存到mysql中;儲存資料高峰能達到日均千萬,瓶頸在於直接入庫併發太高,可能會把mysql幹垮。 問題分析 思考:應用網站架構的衍化過程中,應用最新的框架和工具技術固然是最優選擇;但是,如果能在現有的框架的基礎上提

牛客練習賽13 A B C D康拓展開 EDP or 記憶化搜尋 F 思維

A 幸運數字Ⅰ 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 262144K,其他語言524288K 64bit IO Format: %lld 題目描述 定義一個數字為幸運數字當且僅當它的所有數位都是4或者7。 比如說

作業系統精髓與設計原理1. 計算機系統概述

計算的基本構成 處理器 記憶體 輸入輸出模組 系統匯流排 程式的執行 程式執行分為取指令與執行指令兩個過程,指令由操作碼與資料地址兩部分; 取指令即根據PC中的指令地址讀取指令至IR,執行就是將IR中的對應的操作與資料進行載入和執行。 指令格式與整數資料

BZOJ5298 CQOI2018 交錯序列 DP+矩陣快速冪優化*

BZOJ5298 CQOI2018 交錯序列 【DP+矩陣快速冪優化】 Description 我們稱一個僅由0、1構成的序列為”交錯序列”,當且僅當序列中沒有相鄰的1(可以有相鄰的0)。例如,000,001,101,都是交錯序列,而110則不是。對

DP演算法篇之初學LIS\LCS\二維DP\帶條件DP

最近參加2016華為軟體精英挑戰賽,題目也比較直接,就是求過定點的最短路。這題和以前練得不一樣,感覺是不是要用DP(動態規劃)。可是對於DP演算法,我還是啥都不懂,於是好好補補。 看完入門,有點

Material Design視覺設計語言UI元件設計(五):提示框

【Material Design視覺設計語言】章節列表 提示框(Dialog)用於提示使用者作一些決定,或者是完成某個任務時需要的一些其它額外的資訊。 一 提示框的功能 Dialog可以是用一種取消/確定的簡單應答模式,它常見的應用場景

git 埠拒絕解決方案ssh: connect to host github.com port 22: Connection refused

前言 前一陣兒,在公司同步github程式碼到本地的時候,爆出了這樣的一個錯誤ssh: connect to host github.com port 22: Connection refused。根據英文可以看出,ssh埠號被拒絕了,應該是被公司的網給禁掉了

Material Design視覺設計語言UI元件設計(四):表格

【Material Design視覺設計語言】章節列表 表格是一個用來展示原始資料集,使用者可操作的視覺化的網格結構,並且通常出現於桌面企業產品中。 一 表格的佈局 1.1 表格型別 1.1.1 基本表格 基本的表格佈局如下

DP-最大子串和PAT1007. Maximum Subsequence Sum

Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, Ni+1, ..., Nj } where 1 <= i <= j <= K. The 

ssl2290-潛水員dp之二維費用

其實這是一道例題,但確實是我做過最難(其他的水到炸)的一道二維費用 Description潛水員為了潛水要使用特殊的裝備。他有一個帶2種氣體的氣缸:一個為氧氣,一個為氮氣。讓潛水員下潛的深度需要各種

51nod 1020 逆序排列Dp+思維遞推優化好題!好題!好題!

基準時間限制:2 秒 空間限制:131072 KB 分值: 80 難度:5級演算法題 在一個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為一個逆序。一個排列中逆序的總數就稱為這個排列的逆序數。 如2 4 3 1中,2

flex——application監聽Keyboard事件 疑問,待續

程式碼: <?xml version="1.0" encoding="utf-8"?> <mx:Application applicationComplete="init()"   xmlns:mx="http://www.adobe.com/2006/mx