简单阅读程序
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int MAXN = 13;
int T, n, m;
struct Col {
int a[MAXN], maxx;
void Clear() {
maxx = 0;
}
void Intt() {
for (int i = 0; i < n; ++i)
maxx = max(maxx, a[i]);
}
bool operator < (const Col &col) const {
return maxx > col.maxx;
}
} c[114518];
int w[1 << MAXN], dp[MAXN][1 << MAXN];
void nxt(int &x, int y) {
x = (x - 1) & y;
}
signed main() {
scanf("%d%d", &n, &m);
memset(dp, 0, sizeof(dp));
for (int i = 0; i < m; ++i)
c[i].Clear();
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
cin >> c[j].a[i];
for (int j = 0; j < m; ++j)
c[j].Intt();
sort(c, c + m);
for (int i = 0; i < min(n, m); ++i) {
for (int j = 0; j < (1 << n); ++j) {
w[j] = 0;
for (int k = 0; k < n; ++k) {
int res = 0;
for (int l = 0; l < n; ++l)
if ((1 << l) & j)
res += c[i].a[(l + k) % n];
w[j] = max(w[j], res);
}
}
for (int j = 0; j < (1 << n); ++j) {
if (i == 0) {
dp[i][j] = w[j];
continue;
}
dp[i][j] = dp[i - 1][j];
int k = j;
while(k) {
dp[i][j] = max(dp[i][j], dp[i - 1][k] + w[k ^ j]);
nxt(k, j);
}
}
}
cout << dp[(n < m ? n : m) - 1][(1 << n) - 1] << endl;
return 0;
}
时间限制 空间限制
输入 , 表示一个 的矩阵,提示:进行一些操作,最后求出行里最大值的和。然后输入这个矩阵,保证矩阵中每一个数 ,满足 。
判断题:
- (2') 若将 nxt 函数替换成下面的函数,程序会出错。
void nxt(int &x, int y) {
x = x - 1 & y;
}
-
(1.5') 若将
dp[(n < m ? n : m) - 1][(1 << n) - 1]
替换成为dp[n < m ? n : m - 1][(1 << n) - 1]
程序会出错。 -
(1.5') 如果此题将 范围扩大成为 此程序将无法正确通过此题。
-
(2') 本题所支持的操作是交换两个行。
-
(2') 程序只会选择列里最大的前 列。
选择题:
- (2') 这题用了什么算法
A.状压 dp B. 数位 dp C.猴王算法 D. ssh 算法
- (4') 程序的时间复杂度为
A. B. C. D.
- (4')如果输入数据如下,输出为
3 6
4 1 5 2 10 4
8 6 6 4 9 10
5 4 9 5 8 7
A. 25 B. 27 C. 29 D. 33
- (10') €€£是什么
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通