sdut-2725-The Urge to Merge-状压DP

原创 2013年12月02日 20:15:34

把数组竖起来,从上往下走。

如果当前位置是竖着乘的,那么第一个点标记为1.否则标记为0.

样例最终的状态为:

0 0 1

0 1 0

1 0 0 

0 0 0

#include<iostream>
#include<cmath>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
int maps[1010][11];
int dp[1010][11];
int pan(int x,int y)
{
    int i;
    for(i=0;i<3;i++)
    {
        int tt=(1<<i);
        if((x&tt)&&(y&tt))return 0;
    }
    return 1;
}
int add(int x,int y,int z)
{
    int ans=0;
    int ss[4];
    int i;
    for(i=0;i<3;i++)
    {
        if(x&(1<<i))ss[i+1]=1;
        else ss[i+1]=0;
    }
    for(i=0;i<3;i++)
    {
        if(y&(1<<i))
        {
            ans+=maps[z-1][i+1]*maps[z][i+1];
            ss[i+1]=1;
        }
    }
    int t1,t2;
    t1=t2=0;
    if(ss[1]==0&&ss[2]==0)t1=maps[z][1]*maps[z][2];
    if(ss[2]==0&&ss[3]==0)t2=maps[z][2]*maps[z][3];
    ans+=max(t1,t2);
    return ans;
}
int main()
{
    int i,j,k,n;
    int cas=0;
    while(~scanf("%d",&n)&n)
    {
        cas++;
        memset(maps,0,sizeof(maps));
        memset(dp,0,sizeof(dp));
        for(i=1;i<=3;i++)
        {
            for(j=1;j<=n;j++)
            {
                scanf("%d",&maps[j][i]);
            }
        }
        for(i=1;i<=n;i++)
        {
            for(j=0;j<(1<<3);j++)
            {
                for(k=0;k<(1<<3);k++)
                {
                    if(pan(j,k))
                    {
                        dp[i][j]=max(dp[i-1][k]+add(j,k,i),dp[i][j]);
                    }
                }
            }
        }
        int maxx=-1;
        for(j=0;j<(1<<3);j++)
        {
            maxx=max(maxx,dp[n][j]);
        }
        printf("Case %d: ",cas);
        cout<<maxx<<endl;
    }
}


对状压dp的一点理解

博主是初学者,一下紧代表个人观点,若有错误欢迎指出。 状压dp       此dp可以理解为最暴力的dp,因为他需要遍历每个状态,所以将会出现2^n的情况数量,所以明显的标志就是数据不能太多(好像是 ...
  • benTuTuT
  • benTuTuT
  • 2017年04月12日 21:51
  • 870

状压DP 入门题

一:方格取数 问题描述: Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数。 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不...
  • sinat_34336698
  • sinat_34336698
  • 2016年08月06日 16:33
  • 1646

状压DP问题

状态压缩·一题目传送:#1044 : 状态压缩·一AC代码:#include #include #include #include #include #include #include ...
  • u014355480
  • u014355480
  • 2015年08月17日 15:00
  • 879

状压DP入门题集锦

POJ 3254 Corn Fields 题意: 一块n*m的田,1表示这个地方可以种植,0代表这个地方不能种植。植物种植还必须满足两株植物不能相邻(横竖都不行)。问共有几种种植方法,而且当...
  • Codeblocksm
  • Codeblocksm
  • 2016年03月05日 10:52
  • 409

状压DP小结

状压dp其实就是将状态压缩成2进制来保存 其特征就是看起来有点像搜索,每个格子的状态只有1或0 模板题,poj3254 就是先给一个map,在这个有些地方不能放牛,有些地方可以 然后牛与牛之间...
  • cbcbcbz
  • cbcbcbz
  • 2017年07月23日 10:40
  • 189

【总结】状压DP

状压DP还是比较恶心的。std代码看不懂,默默把DP全打成记忆搜(…………),位运算虽然知道,但看见代码里充斥着一堆 > & ^ | ~ 感觉心很痛。。。。。 只要理解了倒还是能打。(代码风格变了强...
  • qq_21436421
  • qq_21436421
  • 2017年02月18日 21:30
  • 291

炮兵阵地(经典状压dp)(poj 1185) + 状压dp小技巧详解

炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22809   Accepted: 8829 ...
  • Yyyy_H
  • Yyyy_H
  • 2016年01月27日 20:58
  • 757

一些关于状压dp的题目

有些题目打得比较幼稚。。。 贴这些主要是收集状压Dpjzoj 1340周长:#include #include #include #include using namespace std; ...
  • HownoneHe
  • HownoneHe
  • 2016年05月23日 20:46
  • 352

状压dp专题----2017.10.1

前言没有前言 T1 Hie with the Pie 题意 解析 代码 提示 出处 T2 Doing Homework 题意 解析 代码 提示 出处 T3 Card Co...
  • qq_39596588
  • qq_39596588
  • 2017年10月08日 07:53
  • 129

|算法讨论|状压DP/位运算 学习笔记

题目 [状压DP]poj 3311:经典TSP问题模板及讲解状态压缩动态规划就是用于某种时候DP的状态难以表示时,使用二进制进行存储状态的一种动态规划。通常会用位运算进行操作: 位运算: 1、对...
  • Darost
  • Darost
  • 2017年02月12日 16:27
  • 337
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sdut-2725-The Urge to Merge-状压DP
举报原因:
原因补充:

(最多只允许输入30个字)