直接考慮 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...