栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 2102 Incredible! Impossible!

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 2102 Incredible! Impossible!

#include<cstdio>#include<algorithm>int n, col[3], row[1 << 7];typedef long long int64;int64 f[2][1 << 7][1 << 7], g[2][1 << 7][1 << 7];const int64 p = (int64) (1e17);bool check() {int col_sum = 0, row_sum = 0;for (int i = 0; i < 3; ++i) {col_sum += col[i];}for (int i = 0; i < n; ++i) {row_sum += row[i];}return col_sum == row_sum;}int64 sum(int at, int s, int t1, int t2) {if (at == 0) {t1 = std::max(t1, 0);return t1 ? (g[0][s][t2] - g[0][s][t1 - 1] + p) % p : g[0][s][t2];} else {t1 = std::max(t1, 0);return t1 ? (g[1][t2][s] - g[1][t1 - 1][s] + p) % p : g[1][t2][s];}}int64 solve() {if (!check()) {return 0LL;}int x = 0, y = 1;for (int a = 0; a <= col[0]; ++a) {for (int b = 0; b <= col[1]; ++b) {f[x][a][b] = (a + b <= row[0] ? 1LL : 0LL);}}for (int i = 1; i < n; ++i, std::swap(x, y)) {for (int a = 0; a <= col[0]; ++a) {g[0][a][0] = f[x][a][0];for (int b = 1; b <= col[1]; ++b) {g[0][a][b] = (f[x][a][b] + g[0][a][b - 1]) % p;}}for (int b = 0; b <= col[1]; ++b) {g[1][0][b] = f[x][0][b];for (int a = 1; a <= col[0]; ++a) {g[1][a][b] = (f[x][a][b] + g[1][a - 1][b]) % p;}}for (int a = 0; a <= col[0]; ++a) {for (int b = 0; b <= col[1]; ++b) {if (a - 1 >= 0 && b + 1 <= col[1]) {f[y][a][b] = f[y][a - 1][b + 1] + sum(0, a, b - row[i], b + 1) - sum(1, b + 1, a - row[i] - 1, a) + p;f[y][a][b] %= p;} else {f[y][a][b] = 0LL;for (int aa = 0; aa <= a; ++aa) {for (int bb = 0; bb <= b && aa + bb <= row[i]; ++bb) {f[y][a][b] += f[x][a - aa][b - bb];f[y][a][b] %= p;}}}}}}return f[x][col[0]][col[1]];}int main() {while (scanf("%d", &n) == 1) {for (int i = 0; i < 3; ++i) {scanf("%d", &col[i]);}for (int i = 0; i < n; ++i) {scanf("%d", &row[i]);}printf("%lldn", solve());}return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/374996.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号