題目大意就是給n個數,然後有n個回合,在第i個回合操作有2種,一種是對當前數*-1,第二種是對當前數+ai,問你n回合後數變成-666的操作方案數是多少?另外數的初始值是0,還有在乙個合法的方案裡,不能有某個回合結束後數變成了666
這題用的是計數dp,定義dp[i][j]表示第i個回合結束之後,數變成j的方案個數。初始化是dp[0][0]=1,其餘為0。狀態轉移的話是dp[i][-j]+=dp[i-1][j],dp[i][j+a[i]]+=dp[i-1][j],然後跳過666的轉移。然後因為數的變化範圍是-666*300到666*300當時陣列的下標是不能為負數的,所以在這裡做了個對映,把-666*300到666*300這個區間對映到-666*300+700*300到666*300+700*300這個區間了,相當於第i個回合結束後數為j的方案數為dp[i][j+700*300],開二維爆記憶體了,然後就滾掉一維。
#includeusing namespace std;
#define ll long long
#define tmp 210000
const ll mod=1e8+7;
ll dp[2][420000];
int a[305];
int main()
pos=(pos+1)%2;
if(i==n)
}}
牛客練習賽41 B 666RPG
題目傳送門 這裡呢,用的方法是dp,俗話說的好 神用dp,人用暴力 但是呢,我都不會 白嫖大佬的 方法簡介 首先,先const 乙個maxn 666 300 5 這裡加5嘛,就只有防 的作用,重要的是這個666 300,為什麼要定義乙個maxn呢,因為,我們要開乙個4 maxn大的二維陣列ans 2...
牛客練習賽41 B 666RPG
題意 有n個回合,每個回合給1個數,每個回合你有兩種選擇 1.加上第i個數 2.將當前數乘 1 想知道有多少種不同的方案使得 n個回合後分數變為 666,且在任何乙個回合之後分數都不為666 n 666 666 答案模1e8 7 n 666 666 分析 n 666 666 我們可以用dp i j ...
牛客練習賽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...