源哥每日一题第十四弹 hdu 1565 还是状压dp

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1565

题意:自己念

分析:有了上一题的基础,这题的状态方程也好想:dp[i][s]表示第i行第s个状态取得的最大值。

  可以预处理出每一行每一种状态所能获得的值,方程就是dp[i][j] = max(dp[i][j],dp[i-1][k]+sum[i][j]);

  要注意的就是判断相邻的情况:两个状态,如果a&b!=0则表示它们有相重叠的区域。

#include <bits/stdc++.h>

using namespace std;

void read(){
#ifndef ONLINE_JUDGE
    freopen("D:\\fengyu\\Jiang_C\\.vscode\\in.txt","r",stdin);
	freopen("D:\\fengyu\\Jiang_C\\.vscode\\out.txt","w",stdout);
#endif
}
#define clr(a) memset(a,0,sizeof(a))
#define ll long long
ll a[25][25],s[20005];
ll dp[25][20005];
ll sum[25][20005];
int main() { read();
    int n;
    int num = 0;
    for (int i = 1; i< 1<<20; i++) {
        if(i&i<<1)
            continue;
        s[num++]=i;
    }
    while (cin >> n) {
        clr(dp);
        clr(sum);
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                cin >> a[i][j];
            }
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 0; s[j] < 1<<n; j++) {
                int t = s[j];
                for (int k = 1; k <= n; k++) {
                    if(t&1) sum[i][j]+=a[i][k];
                    t>>=1;
                }
            }
        }
        for (int j = 0; s[j] < 1<<n; j++) {
            dp[1][j] = sum[1][j];
        }

        for (int i = 2; i <= n; i++) {
            for(int j = 0; s[j] < 1<<n; j++) {
                for(int k = 0; s[k] < 1<<n; k++) {
                    if (s[k] & s[j]) continue;
                    dp[i][j] = max(dp[i][j],dp[i-1][k]+sum[i][j]);  

                }
            }
        }
        ll ans = 0;
        for (int j = 0; s[j] < 1<<n; j++) {
            ans = max(ans,dp[n][j]);
        }
        cout << ans << endl;
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/fengyuzhicheng/p/9157960.html

时间: 2024-12-10 02:34:56

源哥每日一题第十四弹 hdu 1565 还是状压dp的相关文章

源哥每日一题第十八弹 poj 1182 并查集

题目链接:http://poj.org/problem?id=1182 题意:看不懂?退群吧 比平常的并查集加了一个判断集合间关系的操作: 开一个数组记录当前点所在集合的次序(第几个集合)用012表示 比较简单的思路,不过体现了并查集的精妙 #include <iostream> #include <cstring> #include <cstdio> using namespace std; int dad[500005]; int st[50005]; int fi

源哥每日一题第十九弹 poj 2236 还是冰茶集

连接:http://poj.org/problem?id=2236 题意:有一堆坏电脑,和两种操作:O表示修好这台电脑,S 询问两台电脑是否联通.主要是判电脑是否联通:两台电脑间距离小于d就是联通的. 题解:emmm--直接写啊 #include <iostream> #include <cstdio> using namespace std; int n; long long d; int pre[1005]; int jud[1005]; struct coor { long

源哥每日一题第十三弹 百练4124:海贼王之伟大航路 状压dp

连接:http://bailian.openjudge.cn/practice/4124 题意:从1到n走过所有点恰好一次最短时间.乱搞的话会完美的超时(阶乘级别的复杂度,虽然范围很小,但是也足够超时了). 思路:先想一个不太成熟的思路.用dp[s][j]表示.s记录的是每个点是否被走过的状态.而dp[s][j]表示的是从1走到j状态所用的最小时间.这样的思路成不成立呢?首先,考虑初始值.开始是在1号点,那么dp[1][1]自然就是0了,其他就是max:另外,题面说只要遍历每一个点,而于顺序的话

源哥每日一题第20弹 poj 1272 还是冰茶集

连接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 题意:要 要 要 要啥题意啊就是问题这个东西是不是一颗树 解决方式有很多种,说是冰茶集,但是你用别的方法也可以做啊~ 思路:首先作为一棵树一定满足顶点数等于边数+1,但只满足了这个条件也不行(脑补一个圆)判断方法:比方说a和b俩节点,他俩爹要是一样,你再把a和b连上,那不就有环了吗 p.s. 我记得这个题在hdu上会爆栈来着-- 还想硬广一下 #pragma comment(linker, "/S

爱创课堂每日一题第二十四天-ETag应用?

Etag由服务器端生成,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改.常见的是使用If-None-Match.请求一个文件的流程可能如下: ====第一次请求=== 1.客户端发起 HTTP GET 请求一个文件: 2.服务器处理请求,返回文件内容和一堆Header,当然包括Etag(例如"2e681a-6-5d044840")(假设服务器支持Etag生成和已经开启了Etag).状态码200 ====第二次请求=== 客户端发起 HTTP

QDUOJ 来自xjy的签到题(bfs+状压dp)

来自xjy的签到题 Description 爱丽丝冒险来到了红皇后一个n*n大小的花园,每个格子由'.'或'#'表示,'.'表示爱丽丝可以到达这个格子,‘#’表示爱丽丝不能到达这个格子,爱丽丝每1分钟可以移动到非'#'的相邻格子(与当前所在格子具有公共边).花园下面有m个隧道,每个隧道有一个出口和一个入口.当爱丽丝到达隧道的入口时,她可以选择(也可以不选择)进入隧道入口,并通过隧道一次,然后立即(不花费时间)出现在隧道出口.爱丽丝一开始可以降临在花园的任何地方.有好奇心的爱丽丝想知道,她通过所有

POJ 2411 &amp;&amp; HDU 1400 Mondriaan&#39;s Dream (状压dp 经典题)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12341   Accepted: 7204 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series

【BZOJ-3195】奇怪的道路 状压DP (好题!)

3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 305  Solved: 184[Submit][Status][Discuss] Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n.m条道路连接在这些城市之间,每条道路将两个城市连接起来,使得两地的居民可以方便地来往.一对城市之间可能存在

刷题总结——bzoj1725(状压dp)

题目: 题目描述 Farmer John 新买了一块长方形的牧场,这块牧场被划分成 N 行 M 列(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地. FJ 打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是,有些土地相当的贫瘠,不能用来放牧.并且,奶牛们喜欢独占一块草地的感觉,于是 FJ 不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边.当然,FJ 还没有决定在哪些土地上种草. 作为一个好奇的农场主,FJ 想知道,如果不考虑草地的总块数,