插头DP。。。网格图,有障碍,格子上有权值,求总权值最大的简单路径。

  因为路径的起始点不确定。。所以多开一维表示当前已经有多少个独立插头。。

  只要不合并相同的联通块,并且已经用了2个独立插头,那就是一条简单路径了。。。

  需要特判路径上只有一个点的情况。

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #define ll long long
  6 using namespace std;
  7 const int modd=5233,maxzt=123333;
  8 struct zs1{
  9     struct zs{
 10         int pre;ll too;
 11     }e[maxzt];int tot,last[modd];
 12     int f[maxzt];ll zt[maxzt];
 13     inline int get(ll v){
 14         int i,x=v%modd;
 15         for(i=last[x];i&&e[i].too!=v;i=e[i].pre);
 16         if(i)return i;
 17         e[++tot].too=v,e[tot].pre=last[x],last[x]=tot,
 18         f[tot]=0,zt[tot]=v;
 19         return tot;
 20     }
 21 }hm[2][3];
 22
 23 int i,j,k,n,m;
 24 bool can[23][23];int val[23][23];
 25 int mp[9],id[9];bool u[9];
 26
 27 inline void clr(bool now,int num){
 28     memset(hm[now][num].last,0,modd<<2);
 29     hm[now][num].tot=0;
 30 }
 31 inline void upd(int &a,int b){if(b>a)a=b;}
 32 inline void decode(ll x){
 33     for(int i=m;i>=0;i--)mp[i]=x&7,x>>=3;
 34 }
 35 inline ll encode(){
 36     int i,tt=0;ll x=0;
 37     memset(u,0,9);
 38     for(i=0;i<=m;mp[i]=id[mp[i]],x=x<<3|mp[i],i++)
 39         if(!u[mp[i]]&&mp[i]>0)u[mp[i]]=1,id[mp[i]]=++tt;
 40     return x;
 41 }
 42 inline void dp_blank(int x,int y,bool pre){
 43     int i,left,up,f;ll zt;bool now=pre^1;
 44     for(int num=0;num<=2;num++){
 45 //        printf("    %d,%d %d\n",x,y,num);
 46         clr(now,num);
 47         for(i=1;i<=hm[pre][num].tot;i++){
 48             zt=hm[pre][num].zt[i],f=hm[pre][num].f[i];
 49             if(y==1)zt>>=3;
 50             decode(zt);
 51 //            for(int j=0;j<=m;j++)printf(" %d",mp[j]);printf("    %d    zt:%lld\n",f,zt);
 52             left=mp[y-1],up=mp[y];
 53             if(left&&up&&left!=up){
 54                 mp[y-1]=mp[y]=0;
 55                 for(int j=0;j<=m;j++)if(mp[j]==up){mp[j]=left;break;}
 56                 upd( hm[now][num].f[ hm[now][num].get(encode()) ] , f+val[x][y] );
 57             }
 58             if(!left&&!up){
 59                 upd( hm[now][num].f[ hm[now][num].get(encode()) ] , f );
 60                 if(can[x+1][y]&&can[x][y+1])
 61                     mp[y-1]=mp[y]=7,
 62                     upd( hm[now][num].f[ hm[now][num].get(encode()) ] , f+val[x][y] );
 63             }
 64             if((!left)^(!up)){
 65                 int j=left|up;
 66                 if(can[x+1][y])
 67                     mp[y-1]=j,mp[y]=0,
 68                     upd( hm[now][num].f[ hm[now][num].get(encode()) ] , f+val[x][y] );
 69                 if(can[x][y+1])
 70                     mp[y-1]=0,mp[y]=j,
 71                     upd( hm[now][num].f[ hm[now][num].get(encode()) ] , f+val[x][y] );
 72             }
 73         }
 74         if(num>0)
 75             for(i=1;i<=hm[pre][num-1].tot;i++){
 76                 zt=hm[pre][num-1].zt[i],f=hm[pre][num-1].f[i];
 77                 if(y==1)zt>>=3;
 78                 decode(zt);
 79 //                for(int j=0;j<=m;j++)printf(" %d",mp[j]);printf("    (dl) %d   zt:%lld\n",f,zt);
 80                 left=mp[y-1],up=mp[y];
 81                 if(!left&&!up){
 82                     if(can[x+1][y])
 83                         mp[y-1]=7,mp[y]=0,
 84                         upd( hm[now][num].f[ hm[now][num].get(encode()) ] , f+val[x][y] );
 85                     if(can[x][y+1])
 86                         mp[y-1]=0,mp[y]=7,
 87                         upd( hm[now][num].f[ hm[now][num].get(encode()) ] , f+val[x][y] );//,printf("   %lld %d\n",encode(),y);
 88                 }
 89                 if((!left)^(!up))
 90                     mp[y-1]=mp[y]=0,
 91                     upd( hm[now][num].f[ hm[now][num].get(encode()) ] , f+val[x][y] );
 92             }
 93     }
 94 }
 95 inline void dp_bar(int x,int y,bool pre){
 96     int i,left,up,f;ll zt;bool now=pre^1;
 97     for(int num=0;num<=2;num++){
 98         clr(now,num);
 99         for(i=1;i<=hm[pre][num].tot;i++){
100             zt=hm[pre][num].zt[i],f=hm[pre][num].f[i];
101             if(y==1)zt>>=3;
102             decode(zt),
103             left=mp[y-1],up=mp[y];
104             if(!left&&!up)
105                 upd( hm[now][num].f[ hm[now][num].get(encode()) ] , f+val[x][y] );
106         }
107     }
108 }
109
110 int ra;char rx;
111 inline int read(){
112     rx=getchar(),ra=0;
113     while(rx<'0'||rx>'9')rx=getchar();
114     while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra;
115 }
116 int main(){
117     for(int T=read();T;T--){
118         n=read(),m=read();
119         memset(can,0,sizeof(can));
120         int ans=0;
121         for(i=1;i<=n;i++)for(j=1;j<=m;j++)val[i][j]=read(),can[i][j]=val[i][j]!=0,ans=max(ans,val[i][j]);
122         bool pre=0,now=1;
123         clr(pre,0),clr(pre,1),clr(pre,2);
124         hm[pre][0].f[ hm[pre][0].get(0) ]=0;
125         for(i=1;i<=n;i++)for(j=1;j<=m;j++,swap(pre,now))
126             if(can[i][j])dp_blank(i,j,pre);else dp_bar(i,j,pre);
127         for(i=1;i<=hm[pre][2].tot;i++)
128             upd(ans,hm[pre][2].f[i]);
129         printf("%d\n",ans);
130     }
131     return 0;
132 }

View Code

转载于:https://www.cnblogs.com/czllgzmzl/p/5495227.html

[ZOJ3213] Beautiful Meadow相关推荐

  1. 杭电oj题目题型分类(转)

    1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...

  2. HDOJ题目分类大全

    版权声明:本文为博主原创文章,欢迎转载,转载请注明本文链接! https://blog.csdn.net/qq_38238041/article/details/78178043 杭电里面有很多题目, ...

  3. HDU题目分类大全【大集合】

    基础题: 1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.  1032.1037.1040.1048.1056.105 ...

  4. 杭电OJ题目分类(转载)

    1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...

  5. hdoj杭电问题分类

    杭电上的题虽然多,但是一直苦于找不到问题分类,网页都是英文的,所以平时做题也没怎么看,今天仔细一看,问题分类竟然就在主页....做了那么久的题居然没发现,表示已经狗带..不要笑,不知道有没有像我一样傻 ...

  6. 转载:Hdu 题目分类

    原址点击 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056. ...

  7. HD OJ 题目分类

    动态规划:2037 2054 2084 hdu题目分类(转) http://blog.csdn.net/vsooda/article/details/7258791 1001 整数求和 水题 1002 ...

  8. hdu与poj题目分类

    POJ 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(po ...

  9. 动态规划详解 转自瞿老师的博客

    目录     一.动态规划初探       1.递推       2.记忆化搜索       3.状态和状态转移       4.最优化原理和最优子结构       5.决策和无后效性   二.动态规 ...

  10. ACM入门题目(北大ACM教材)

    这个是自己经过一段时间A的题目,非抄书!然后也自己做了一个工程把它管理起来. ACM.h   这个头文件主要是一些头文件映如以及一些ACM函数的定义 #include<iostream> ...

最新文章

  1. 关于ListView中adapter调用notifyDataSetChanged无效的原因
  2. 关于 redis.properties配置文件及rule
  3. 炒菜机器人的弊端_机器人炒菜真不是你想的那样!
  4. HDOJ(HDU) 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你
  5. 散点图 横纵坐标_厉害了我的Python!散点图还能这么画
  6. 初次使用nginx 搭建http2.0
  7. 人家android博客地址
  8. mysql5.7.23安装详细过程
  9. 程序员如何和产品经理优雅的干架
  10. 测试两个主机之间的连通性_如何使用知行EDI系统模拟连通性测试?
  11. vmware您无权输入许可证秘钥
  12. FINSTCP python2.5
  13. Excel简单学习笔记(1)
  14. Win7加密访问共享文件夹
  15. UE4--用插件加载第三方库lib/dll(lsl)
  16. RabitMQ系列之 Spring RabbitMQ流量削锋实现案例之抢红包
  17. Linkerd2入门
  18. MySQL MGR 安装
  19. git第一次提交代码至远程仓库
  20. [旋转卡壳]最大土地面积 AcWing2617

热门文章

  1. 理解HTTP 代理,负载均衡,缓冲(Buffering)和缓存(Caching)
  2. 约5亿条!华住旗下酒店开房信息泄露于“暗网”售卖,你改密码了吗?
  3. 十年肺腑之言:说说技术总监的“三板斧”
  4. 微信 8.0 来啦,炸裂!
  5. 在VMware下创建新的CentOS虚拟机
  6. python 连接数据库 pymysql模块的使用
  7. Python os.system()调用.sh脚本
  8. UIKit框架-基础控件Swift版本: 7.UISwitch方法/属性详解
  9. 逐步完善自己的3D引擎
  10. 实验任务四:实现登陆界面