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;
}
View Code

相关文章: