搜索
您的当前位置:首页正文

杭电OJ 2082 找单词 C++ DP

来源:好走旅游网

#include <iostream>
#include <string.h>
using namespace std;
int le[30], n1[55], n2[55];
void GF() {
  memset(n1, 0, sizeof(n1));
  memset(n2, 0, sizeof(n2));
  n1[0] = 1;
  for (int i = 1; i <= 26; ++i) {
    for (int j = 0; j <= 50; ++j)
      for (int k = 0; k <= le[i] && k * i + j <= 50; k++)
        n2[j + k * i] +=
            n1[j]; // 这和前面的判断是否存在(只需赋值 为1)组合不同
    for (int j = 0; j <= 50; ++j) {
      n1[j] = n2[j]; // k从0开始保证了n1[x]只增不减
      n2[j] = 0;
    }
  }
}

int main() {
  int N;
  cin >> N;
  while (N--) {
    for (int i = 0; i < 26; i++) {
      cin >> le[i + 1];
    }
    GF();
    int sum = 0;
    for (int i = 1; i <= 50; i++)
      sum += n1[i];
    cout << sum << endl;
  }
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top