牛客練習賽41 B 666RPG

2022-03-11 14:31:29 字數 1133 閱讀 7065

題意:有n個回合,每個回合給1個數,每個回合你有兩種選擇

1.加上第i個數

2.將當前數乘-1

想知道有多少種不同的方案使得

n個回合後分數變為-666,且在任何乙個回合之後分數都不為666 n

'> 

-666

'> 

666'>答案模1e8+7 n

'> 

-666

'> 

666'>分析: n

'> 

-666

'> 

666'>我們可以用dp[i][j]表示前i個數中當前數為j的方案數有多少 n

'> 

-666

'> 

666'>則可以得狀態轉移方程為dp[i][j]=dp[i-1][j-a[i]]+dp[i-1][-j]

第一維滾動顯而易見,但第二維出現了負數,而陣列的引數不能為負數,我們則需要設乙個變數add,比add大即為整數,否則為負數

注意:add的大小一定要比陣列第二維可能最大值要大(這題即需比300*666)大,否則可能出現陣列越界情況

1 #include 2

using

namespace

std;

3const

int inf=1

<<30

;4 typedef long

long

ll;5

const

double pi=acos(-1);6

const

int mod=1e8+7;7

const

int maxn=340;8

const

int maxm=610*667;9

const

int add=305*666;//

這裡要注意

10ll a[maxn];

11 ll dp[2

][maxm];

12int

cnt;

13int

main()

23 dp[cnt][666+add]=0;24

}25 cout<2][-666+add]<26return0;

27 }

牛客練習賽41 B 666RPG

題目傳送門 這裡呢,用的方法是dp,俗話說的好 神用dp,人用暴力 但是呢,我都不會 白嫖大佬的 方法簡介 首先,先const 乙個maxn 666 300 5 這裡加5嘛,就只有防 的作用,重要的是這個666 300,為什麼要定義乙個maxn呢,因為,我們要開乙個4 maxn大的二維陣列ans 2...

牛客練習賽41 B 666RPG

題目大意就是給n個數,然後有n個回合,在第i個回合操作有2種,一種是對當前數 1,第二種是對當前數 ai,問你n回合後數變成 666的操作方案數是多少?另外數的初始值是0,還有在乙個合法的方案裡,不能有某個回合結束後數變成了666 這題用的是計數dp,定義dp i j 表示第i個回合結束之後,數變成...

牛客練習賽41 B 666RPG(計數dp)

思路 我們可以用 則可以得狀態轉移方程為 但是 include using namespace std define ll long long const int n 1e6 7 const int base 301 666 const int mod 1e8 7 int a 305 ll dp 2...