摘要:
/* 因为m为连续放的个数 所以状态要包括这个条件 定义状态:f[n][m]表示第n个坑连续放了m个 转移:分两种 1. 第x个坑 放 即m>=1 则 f[x][k]=f[x-1][k-1] 2. 第x个坑 不放 即m==0 则 f[x][k]=Σf[x-1][i] 最后sum一下 f[n][i] */ #include #include using namespace std; long ... 阅读全文
摘要:
/* 先来个灌水法 然后建图跑最小生成树 注意观察题目中的规则 a[1][i]!=a[1][j]&&abs(a[2][i]-a[2][j]) #include #include #include using namespace std; int n,m,tot,g[1001][1001],a[3][1001],minn[10001],f[10001],sum,bb; char s[101][10... 阅读全文
摘要:
/* 最少步数问题 妥妥的Bfs 很显然队列里存的是串(可能存个数也可以 就像8数码那样) 然后每次队首元素弄出来 能换的都换一遍 最后每次换完的新串入队前先判断到头了没 最后说一句 String大法好0.0 */ #include #include #include #include using namespace std; int ans,n=1,head,tail,t[2000050];... 阅读全文
摘要:
/* 数据范围太小 暴力暴力 Dfs直接 终止条件嘛 就是4中目标棋局 挨着枚举一遍就好了 搜索的起点一定是空格 当然 空格周围有黑有白 黑先走或者白先走答案可能不一样 所以 维护一个b 表示这一步走那种颜色 b=1先走白棋 b=2先走黑棋 */ #include #include #include using namespace std; int xx[5]={0,0,0,1,-1}... 阅读全文
摘要:
/* 首先建立模型 可以看成是三个水杯 第三个无穷大 (这里看成是201足够了) 最少步数 想到Bfs 维护队列里的状态:要有个步数 还要有v :此时刻三个杯子有多少水 然后倒水:因为没有刻度 所以有两种情况:要么出水的为空 要么接水的满了 然后每次取队首时判断有没有某一个杯子装的水恰好为答案 注意判重时可以弄一个f [a][b] 表示第一个杯子有a升水 第二个杯子有b升水的状态存在了没... 阅读全文
摘要:
/* 看到n的范围就觉得这个不可能是DP啥的 因为这个接龙的规则十分的简单 只要前缀相同即可 所以先按字典序排一遍 这样保证符合规则的一定挨着 然后弄一个stack 每次拿栈顶元素看看待入栈的元素是否符合条件 如果符合 就入栈 否则的话弹出栈顶元素 接着比较 这样在过程中不断更新最大的ans */ #include #include #include #include #include ... 阅读全文