博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ 3213 Beautiful Meadow(插头DP-一条路径最大值,不固定头尾)
阅读量:5815 次
发布时间:2019-06-18

本文共 2572 字,大约阅读时间需要 8 分钟。

题目链接:

题意:给定一个n*m的寻宝图。有些位置不能走,其余位置每个位置都有一个宝藏。从一个位置出发到另一个位置结束(这两个位置都是可以自己选择的),每个格子最多走一次。求最大价值。

思路:第一道头尾不固定的单路径。增加了一个Num,表示当前已经使用的独立插头的数目,这样只要保证num不超过2而且不合并相同的连通分量就能保证最后是一条简单路径。那么编码的时候设x表示左侧插头,y表示上面插头,x、y均存在时合并然后修改;x和y中只存在一个时或者都不存在时,在Num<2时可以考虑增加插头。

 

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define max(x,y) ((x)>(y)?(x):(y))#define min(x,y) ((x)<(y)?(x):(y))#define abs(x) ((x)>=0?(x):-(x))#define i64 long long#define u32 unsigned int#define u64 unsigned long long#define clr(x,y) memset(x,y,sizeof(x))#define CLR(x) x.clear()#define ph(x) push(x)#define pb(x) push_back(x)#define Len(x) x.length()#define SZ(x) x.size()#define PI acos(-1.0)#define sqr(x) ((x)*(x))#define FOR0(i,x) for(i=0;i
=0;i--)#define FORL1(i,a) for(i=a;i>=1;i--)#define FORL(i,a,b)for(i=a;i>=b;i--)#define rush() int CC; for(scanf("%d",&CC);CC--;)#define Rush(n) while(scanf("%d",&n)!=-1)using namespace std;void RD(int &x){scanf("%d",&x);}void RD(i64 &x){scanf("%lld",&x);}void RD(u32 &x){scanf("%u",&x);}void RD(double &x){scanf("%lf",&x);}void RD(int &x,int &y){scanf("%d%d",&x,&y);}void RD(u32 &x,u32 &y){scanf("%u%u",&x,&y);}void RD(double &x,double &y){scanf("%lf%lf",&x,&y);}void RD(int &x,int &y,int &z){scanf("%d%d%d",&x,&y,&z);}void RD(u32 &x,u32 &y,u32 &z){scanf("%u%u%u",&x,&y,&z);}void RD(double &x,double &y,double &z){scanf("%lf%lf%lf",&x,&y,&z);}void RD(char &x){x=getchar();}void RD(char *s){scanf("%s",s);}void RD(string &s){cin>>s;}void PR(int x) {printf("%d\n",x);}void PR(i64 x) {printf("%lld\n",x);}void PR(u32 x) {printf("%u\n",x);}void PR(double x) {printf("%.4lf\n",x);}void PR(char x) {printf("%c\n",x);}void PR(char *x) {printf("%s\n",x);}void PR(string x) {cout<
<
cnt[i]) cnt[i]=val; return; } } state[e]=s; cnt[e]=val; next[e]=head[x]; head[x]=e++; }};node dp[2];int Num;void decode(int code[],int m,i64 st){ Num=st&7; st>>=3; int i; FORL0(i,m) code[i]=st&7,st>>=3;}i64 encode(int code[],int m){ i64 ans=0; int hash[15],i,cnt=1; clr(hash,-1); hash[0]=0; FOR0(i,m+1) { if(hash[code[i]]==-1) hash[code[i]]=cnt++; code[i]=hash[code[i]]; ans=(ans<<3)|code[i]; } ans=(ans<<3)|Num; return ans;}void update1(int i,int j){ int x,y,k,t,q=j==m?m-1:m; i64 c; FOR0(k,dp[pre].e) { decode(code,m,dp[pre].state[k]); c=dp[pre].cnt[k]; x=code[j-1]; y=code[j]; if(x&&y) { if(x!=y) { code[j-1]=code[j]=0; FOR0(t,m+1) if(code[t]==y) code[t]=x; dp[cur].push(encode(code,q),c+s[i][j]); } } else if(x||y) { if(i

 

  

 

转载地址:http://txmbx.baihongyu.com/

你可能感兴趣的文章
基于Bootstrap的jQuery开关按钮插件
查看>>
Python实现代码统计工具——终极加速篇
查看>>
修改linux文件权限命令:chmod
查看>>
如何删除PHP数组中的元素,并且索引重排(unset,array_splice)?
查看>>
网站架构演变
查看>>
Angular学习笔记(三) - 父子组件通信 @Input 与 @OutInput 详解 ( 下 )
查看>>
PAT A1098 堆排序
查看>>
chrome浏览器下audio自动播放的hack
查看>>
前嗅ForeSpider教程:字段的取值与清洗
查看>>
支持后悔药的etcdui
查看>>
Python数据分析:手写数字识别初步
查看>>
swoole之协程channel元素个数
查看>>
云捕Redis实战
查看>>
python基础知识
查看>>
程序员面试如何与HR谈薪
查看>>
Flask之请求钩子
查看>>
程序员练级攻略(2018):Java底层知识
查看>>
postcss-bem插件在webpack4以上版本报错处理 .moveTo is not a function
查看>>
CSS
查看>>
基于OpenSSL的HTTPS通信C++实现
查看>>