摘要:Div2 AlienAndSetDiv2 1000 pts题意:1~2N的数分成2个数组A,B,并且数组中按增序排列,同时满足|A[i] - B[i]| K = K;34 this->N = N;35 36 return dfs(2*N, 0);37 }38 };Vi...
阅读全文
摘要:给定一个m*n的方格子,要求用3*1的骨牌去覆盖,骨牌可以用横放或者竖放,问最终有多少种放置方式,将其铺满。分析:由于最多30行,每行最多9列,所以可以按行来dp,设计每行的状态从而进行转移,考虑每个骨牌放置对下一行的影响,共有0,1,2,3种方式,0对应横放或者竖放时最下面那个格子,此行对下一行没...
阅读全文
摘要:斯坦纳树是一类比较特殊的DP吧,主要针对点集连通问题,通常dp[i][s]表示以i为根的,连通状态为s的一棵树的最小权值,有两种转移方式,其中state[i]表示点i的二进制标号,通常无关的点state值为0,dp[i][s] = min{dp[i][s], dp[i][j] + dp[i][k]}...
阅读全文
摘要:一开始还在纠结怎么表示一个状态,毕竟是一个串。后来搜了一下题解发现了这里用一个整数的前12位表示转态就好了 ,1~o,0~'-',每个状态用一个数来表示,然后dp写起来就比较方便了。代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #define esp 1e-613 #define pb push_back14 #define in freopen("in.t
阅读全文
摘要:根据地图,要求固定两点间最短路径的条数 。这题的输入数据就是个坑,题目有没有说明数据之间有多个空格,结尾换行符之前也不止一个空格,WA了好几遍,以后这种情况看来都要默认按照多空格的情况处理了。可以先利用bfs求出起点到各点的最短距离,然后dfs统计 num[x][y]表示起点到x,y的最短路径数,转移方程为 num[x][y] += num[nx][ny], nx = x +dx[k],ny = y + dy[k],map[nx][ny] != 0.代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #...
阅读全文
摘要:1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #define esp 1e-611 #define pb push_back12 #define in freopen("in.txt", "r", stdin);13 #define out freopen("out.txt", "w", stdout);14 #define print(a) printf(&
阅读全文
摘要:看了这里 http://blog.csdn.net/acm_cxlove/article/details/8679230的分析之后自己又按照自己的模板写了一遍,算是对spfa又加深了一步认识(以前真是只会用,没想太多)。又来当一次搬运工,一点点进步。题意是这样的:A个村庄,B个城堡,共有K次穿越的机会,且不能经过城堡或者穿越距离必须不超过L,否则必须停下来,当然,不能再道路中间停下来。按照大大的思路是这样做的:对于每出队的一个结点u,均有两种方式继续走下去,一中是使用一次穿越,另一种是不使用。这样对于使用穿越的情况,必须考虑所有满足d[u][v] 2 #include 3 #includ...
阅读全文
摘要:矩形嵌套时间限制:3000ms | 内存限制:65535KB难度:4描述有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a 2 #include 3 #include 4 #define N 1100 5 6 int G[N][N]; 7 int n,max; 8 int ans[N]; 9 int d[N];10 typedef struct11 {12 int l,w;13 } s;14 s r[N];15 int f(int);16 17 /*18 void print_ans(int t,int count)19 {20...
阅读全文
摘要:题目大致意思是:一个整数序列包含N个1~100的整数(3#include#define min(a,b) ((a)<(b)?(a):(b))int dp[110][110];int main(void){ int i,j,k,a[110]; int n; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); for(k=2;k<=n;k++) for(i=1;i+k<=n;i++) { dp[i][i+k]=10000000;设dp[i][k+i]的...
阅读全文