題解 洛谷 P6394 櫻花,還有你

2022-07-21 01:30:17 字數 1014 閱讀 8395

直接考慮 dp。令 \(dp[i][j]\) 表示到第 \(i\) 棵櫻花樹,摘了 \(j\) 片櫻花的可能方案數。轉移方程很顯然,就是列舉在每個樹下摘的幾片櫻花:

\[dp[i][j]=\sum_^dp[i-1][j-k]

\]發現只有上一次會產生影響,所以把 \(i\) 滾動掉可以得到 80pts。

#includeusing namespace std;

int n,m,s;

const int mod=10086001;

int a[5003],dp[5003][2],ans;

int main()

if (s=0) dp[k][i%2]=(dp[k][i%2]+dp[k-j][(i-1)%2]%mod);

} ans+=dp[m][i%2];

ans%=mod;

} cout << ans;

return 0;

}

在此基礎上考慮優化。很顯然,轉移方程裡有求和的形式,可以想到字首和。

先把 \(dp\) 改成一維的,令 \(s\) 是 \(dp\) 的字首和,每次的 \(dp\) 可以由 \(s\) 推到過來。只要每次求一下 \(s\) 就好了。複雜度是 \(o(nk)\)。

#includeusing namespace std;

int n,m,sum;

const int mod=10086001;

int a[5003],dp[5003],s[5003],ans;

inline int read()

while (c>='0'&&c<='9')

return f*ans;

} int main()

if (sumdp[0]=1;

for (int i=1;i<=n;i++)

ans+=dp[m];

ans%=mod;

} cout << ans;

return 0;

}

題解 洛古P6394 櫻花,還有你

同步於 porblem p6394 與擺花很相似。其實就是擺花加強版 大意 有k棵樹,每棵樹下有si朵花,求總和為n的方案數。可以在任意一棵樹下結束 此題dp與遞推的思路其實是差不多的,嚴格來說還是個dp題。本人就稍微講一下多重揹包的思路。細讀題目,這不就是一道多重揹包嗎?此時我們將揹包容量看成櫻花...

題解 洛谷P1445 Violet 櫻花

題面 我們首先對題目中的式子進行化簡 begin frac frac frac y times n x times n xy x n times y x times n y frac frac frac frac frac n frac end 因為 x 和 y 都是正整數,所以 frac 也一定是...

洛谷P1833 櫻花

先說80分 最基本的混合揹包,判斷是完全,01,或是多重,再選擇。1 include2 using namespace std 3int a 10001 c 10001 t 10001 f 10010 n,m 4int main 513 m x2 x1 60 y2 y1 14 scanf d n 1...