0x02 枚举、模拟、递推】的更多相关文章

动态规划(DP)是个很玄学的东西 数位DP实际上 就是把数字上的枚举变成按位的递推 有伪代码 for i =这一位起始值 i<=这一位终止值 dp[这一位][i]+=dp[这一位-1][i]+-加上/去掉的情况 等做一些题完再补充…
arc069.contest.atcoder.jp/tasks/arc069_b 题意:一堆不明身份的动物排成一圈,身份可能是羊或狼,羊一定说实话,狼一定说假话.大家各自报自己的两边是同类还是不同类,问能否有一种满足每个人发言的方式. 解法:已知i-1和i-2可以推i,所以枚举起点羊羊.羊狼.狼羊.狼狼四种可能,最后拿第0只以及第n-1只动物的发言判断是否合法就行. 1 #include <cstdio> 2 int n; 3 char s[100001],r[100001]; 4 bool…
题意:每秒从最高处的杯子倒一杯酒下来,酒流的方式如图,问t秒装满酒的杯子的数目. 思路:把第一杯的值设为t,glass[i][j]=(glass[i-1][j-1]-1)/2+(glass[i-1][j])/2,统计值大于等于1的杯数. #include<cstdio> ][]; int main() { int n,t; scanf("%d%d",&n,&t); glass[][]=t; ;i<=n;i++) { ;j<=n;j++) { ][…
总时间限制:  1000ms 内存限制:  65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2 的最大子矩阵是 9 2-4 1-1 8 这个子矩阵的大小是15. 输入 输入是一个N * N的矩阵.输入的第一行给出N (0 < N <= 100).再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给…
传送门 蒟蒻我关系式没有找出来. 直接模拟递推过程好了. 代码 #include <cstdio> #define N 21 int a, n, m, x, y; int up[N][2], down[N][2], tot[N][2]; int main() { int i; scanf("%d %d %d %d", &a, &n, &m, &x); up[1][0] = up[2][1] = down[2][1] = tot[1][0] =…
1.TYVJ1266(这站是不是已经倒闭了啊) USACO陈年老题,对于这种开关问题啊,最多只按一次,而且第一行随便按完下面的就全确定了,类似的还有固定翻转一个长度的区间,这个也是最多翻一次的而且翻的次数为n-L 2.POJ1958 四塔的汉诺塔问题.但是好像是弱化的二维DP递推,马马虎虎吧 3.bzoj1218 陈年老题,二维前缀和+老古董套路容斥 4.POJ3263 有点意思的题,假如我做的话就会强行差分约束,但是我不能确定类spfa的做法能否满足.正解是对于两个个可以相互看到的点,当然先是…
Description The short story titled Coconuts, by Ben Ames Williams, appeared in the Saturday Evening Post on October 9, 1926. The story tells about five men and a monkey who were shipwrecked on an island. They spent the first night gathering coconuts.…
火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起(包括第3站)上.下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律.现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车).试问x站开出时车上的人数是多少?Input有多组测试数据.每组测试数据…
题目链接 思路:枚举第一列的可能种数,然后递推即可,中途判断是否满足条件,最后再判断最后一列是否满足条件即可. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mp make_pair #define pb push_back using namespace std; LL gcd(LL a,LL b){return b?gcd(b,a%b):a;} LL lcm(L…
网格里放了一些石块,一个炸弹能炸开其所在的行和列.问炸光石块至少要几个炸弹. 枚举不炸开的行数,则可以得出还要炸开几列. 为了不让复杂度爆炸,需要两个优化. 先是递推预处理出f(i)表示i的二进制位中1的个数,f(i)=f(i-2^k)+1,k是可以推算出来的. 还要DFS枚举不炸开的行数,防止重复访问.(类似容斥的时候的写法) #include<cstdio> #include<algorithm> using namespace std; int n,m,f[1<<…