随笔分类 - 状态-DP
摘要:题意:给n个atom(原子),每两个原子相碰会产生能量,不过每次碰撞会消失一个原子,而且不同原子碰撞,消失的原子不同,产生的能量也会不同,给出不同原子相碰撞产生的能量,求出能产生的最多能量。 状态DP 状态s表示n个原子的状态。 每次碰撞只消失一个原子,最后会剩下一个原子不消失,最终的答案是max(dp[(1#include#define max(a,b) (a)>(b)?(a):(b)int n;int dp[1<<10],map[12][12];int DP(int s){ if(dp[s]!=-1) return dp[s]; for(int i=0;i<...
阅读全文
摘要:题意:有n个城市和一个披萨店(0),给出一个(n+1)阶的矩阵,表示 i 到 j 的距离,每个点可走多次。求从披萨店出发,再回到披萨店,把每个城市走一遍要走的最近距离。 状态DP,状态s二进制中第几位表示第几个城市走没走过的状态,0表示每走过,1表示走过。 先用Floyd求任意两点之间的最近距离,然后状态s从0开始到 (1#include#define min(a,b) (a)>(b)?(b):(a)const int inf = 99999999;int n;int map[15][15];int dp[1200][15];void Input(){ for(int i=0;i...
阅读全文
摘要:状态DP主要用的还是DP思想,顾名思义,加了一个状态,主要是用来求状态个数的。 状态是用二进制数来表示的,也就是用0或1来表示,每一行有一个状态数,就是由这一行的0或1组成的,首先我们要获得每行的状态数。for(int i=0;i0) { if(x&1)num++; x>>=1; } return num; } 状态DP最主要的还是DP,上面这些都是求状态的一些代码,不是主要的。 状态DP要求不同行之间的的状态数是否满足要求,因为状态DP用二进制来表示,所以位运算用的比较多。
阅读全文
摘要:状态DP 二进制题型,用0和1来确定所有的情况。 把每一行安排的情况看成一个二进制数,如果这一行的某一列安排了一头奶牛,那么对应的二进制就是1,如果没有安排那么就是0.如果某个状态表示里出现了两个连续的1,那么这个状态永远是非法的,可以去掉,这样处理之后剩下的可能合法。 令dp[i][j]表示第i行状态为j时有多少可能的安排方法,那么状态转移方程是:如果j是合法状态:dp[i][j]=sum{dp[i-1][k]},其中满足k&j==0。 #include#include#define maxn (1=0;j--) { scanf("%d",&n...
阅读全文

浙公网安备 33010602011771号