摘要:
题意:有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 题意:给你三个字符串a,b,c求字符串d的长度。 字符串d满足的要求:是a和b的公共子序列,c是它的子串。 定义dp1[i][j]表示a的第 i 位与b的第 j 位之前相同的子序列长度(包括 i ,j),dp2[i][j]表示a的第 i 位与b的第 j 位之后相同的子序列长度(包括 i ,j)。 查找c的首尾字符在a 和b 的位置,求出c首字符之前a和b的公共子序列的长度以及c尾字符之后a和b的公共子序列的长度,加上c的长度即为所求。#include#include#define maxn 1010#define max(a,b) (a)>(b)?(a):(b)char... 阅读全文
摘要:
状态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... 阅读全文