2015-05-09 14:51:38
总结:... 状态不佳(弱!) 打的很糟糕。
A题,明显的dp,被我搞的很烦,最后在队友提醒下才过掉的...
B题,敲残被hack掉辣
赛后补掉了D题。
A题:dp,背包
用 dp[i][j][k] 来表示用前 i 个人写前 j 行code,总共产生了 k 个 bug(s)
转移的方程很明显:dp[i][j][k] += dp[i-1][j-1][k-a[i]],然后可以降维,开成 dp[j][k] 就够了。
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <map> #include <set> #include <stack> #include <queue> #include <string> #include <iostream> #include <algorithm> using namespace std; #define getmid(l,r) ((l) + ((r) - (l)) / 2) #define MP(a,b) make_pair(a,b) #define PB(a) push_back(a) typedef long long ll; typedef pair<int,int> pii; const double eps = 1e-8; const int INF = (1 << 30) - 1; int n,m,b; ll mod; ll dp[505][505]; int a[505]; int main(){ scanf("%d%d%d%I64d",&n,&m,&b,&mod); for(int i = 1; i <= n; ++i) scanf("%d",&a[i]); dp[0][0] = 1; for(int i = 1; i <= n; ++i){ for(int j = 1; j <= m; ++j){ for(int k = a[i]; k <= b; ++k){ dp[j][k] = (dp[j][k] + dp[j-1][k-a[i]]) % mod; } } } ll ans = 0; for(int i = 0; i <= b; ++i) ans = (ans + dp[m][i]) % mod; printf("%I64d\n",ans); return 0; }