上一页 1 2 3 4 5 6 7 8 9 10 ··· 13 下一页
摘要: 这样类型的题,我觉得应该归类为递推的dp,dp[j][k]表示选j个人达到k=|D(j)-P(j)|时的最大的D(j)+P(j)并且用path[j][k]记录最后一步的选择的编号,输出的时候要对路径上的点进行一遍升序的排序。而且为了能够处理绝对值的问题,加一个修正值fix=m*20则得到的结果都在这个fix的两边,此时fix相当于坐标原点,并且这里要用到一个和修正值有关的公式设div为D(j)-p(j)+fix,我们可以从dp[j][k]里得到D(j)+P(j),则D(j)和P(j)可以用fix,div,以及dp[j][k]表示出来。View Code #include<iostream 阅读全文
posted @ 2012-07-13 14:53 zhenhai 阅读(359) 评论(0) 推荐(0)
摘要: 简单的树形dp,dp[i][0]表示不选i节点以i为根的子树获得的最大值。既然根节点不选,那么子节点只能选一个,否则无法保证连通。根节点若选的话则把所有状态值为正的节点都选了既为最优值View Code 1 #include<stdio.h> 2 #include<string.h> 3 #define N 1005 4 int max(int a,int b) 5 { 6 return a>b?a:b; 7 } 8 int dir[4][2]={0,1,0,-1,1,0,-1,0}; 9 int head[N],t;10 struct edge11 {12 in 阅读全文
posted @ 2012-06-07 00:06 zhenhai 阅读(304) 评论(2) 推荐(0)
摘要: 任意质量分布均匀的多边形的重心位置,可以假定其单位面积质量为1,则面积即可表示质量,而对于质量分布均匀的多边形的重心,需要先以任意一个顶点为参考点,把多边形分为多个三角形,分别求这些三角形的重心位置,此时多边形的质量全在每个三角形的重心上了,即在顶点上,此时,就可以使用gx=Σ(xi*areai)/Σ(areai),gy=Σ(yi*areai)/Σ(areai)期中xi,yi为第i个三角形的中心位置,areai为第i个三角形的面积View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring 阅读全文
posted @ 2012-06-06 23:01 zhenhai 阅读(206) 评论(0) 推荐(0)
摘要: 又是一道二分图匹配,只是这个题,节点多,建图也比较麻烦,要不是别人提醒,都想不到二分图匹配,其实ACM练的最重要的东西就是这种问题的抽象能力,这比掌握任何一种算法,能打的出来代码重要的多,也难得多,这个题每两个单词不匹配就在两个编号之间连一条边,找到最大匹配,就是至少要改掉的数目,剩下的就是最多的正确的数目View Code 1 #include<stdio.h> 2 #include<string.h> 3 #define N 2005 4 #define M 505 5 int match[M]; 6 bool used[M]; 7 int t,head[M]; 8 阅读全文
posted @ 2012-06-06 21:26 zhenhai 阅读(263) 评论(0) 推荐(0)
摘要: 现在在poj上做题,总是要看解题报告,特别是自己没做过的类型,实在是受不了,只能说自己做的题太少了,还不能熟练,这个也是区间dp,这几道区间dp都要求输出最后的结果,必须进行记录,确实麻烦很多View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define N 110 5 #define inf 0x7fffffff 6 using namespace std; 7 char str[N]; 8 struct node 9 {10 int num;11 char s 阅读全文
posted @ 2012-06-06 00:26 zhenhai 阅读(428) 评论(0) 推荐(0)
摘要: 区间dp,dp[i][j]表示i-j所需要的最少要加的括号数,并且记录路径,输出的时候递归输出View Code 1 #include<stdio.h> 2 #include<string.h> 3 #define N 110 4 #define inf 0x7fffffff 5 char str[N]; 6 int dp[N][N]; 7 int path[N][N]; 8 void out(int i,int j) 9 {10 if(i>j)11 return;12 if(i==j)13 {14 if(str[i]=='('||str[i].. 阅读全文
posted @ 2012-06-05 20:59 zhenhai 阅读(189) 评论(0) 推荐(0)
摘要: 题意是说,给出一些道路,要修建一条高速公路,高速公路不能分叉,而且是在给出的图中的一些路径组成,求的是不在高速公路上的点离高速公路的最远距离的最小值是多少。首先要找到一条这个图中的关键路径,既最长的路径,如果高速公路不是最长路径,那么没法满足其他的点到高速公路的距离最大值最小,而找最长路径,先从任意点找到离这个点最远的一个点,然后从最远的点找到一条最长的路径既为最长路径了。很有用的结论View Code 1 #include<stdio.h> 2 #include<string.h> 3 #define N 100005 4 #define inf 0x7fffffff 阅读全文
posted @ 2012-06-04 20:33 zhenhai 阅读(288) 评论(0) 推荐(0)
摘要: 二维树状数组:类似于一维的状态下,二维存储的是一个区域内的状态。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define N 105 5 #define lowbit(x) x&-x 6 using namespace std; 7 int f[N][N]; 8 void init() 9 {10 memset(f,0,sizeof(f));11 }12 int m,n;13 void add(int x,int y,int v)14 {15 int 阅读全文
posted @ 2012-06-02 21:00 zhenhai 阅读(137) 评论(0) 推荐(0)
摘要: 关于这道题的详解在这里http://hi.baidu.com/5l2_/blog/item/dbb67843252e631a73f05df6.html看来该回头看看概率论了,里面的东西全都忘了,ACM真的要学的东西好多啊。自己不会的东西太多了。View Code 1 #include<stdio.h> 2 int main() 3 { 4 int t; 5 double n,m; 6 scanf("%d",&t); 7 while(t--) 8 { 9 scanf("%lf%lf",&n,&m);10 printf(& 阅读全文
posted @ 2012-06-01 23:38 zhenhai 阅读(432) 评论(0) 推荐(0)
摘要: View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define N 125 5 using namespace std; 6 int c1[N],c2[N]; 7 int main() 8 { 9 int i,j,k,n;10 for(i=0;i<=120;i++)11 {12 c1[i]=1;13 c2[i]=0;14 }15 for(i=2;i<=120;i++)16 {17 for(j=0;j<=... 阅读全文
posted @ 2012-06-01 17:00 zhenhai 阅读(159) 评论(0) 推荐(0)
上一页 1 2 3 4 5 6 7 8 9 10 ··· 13 下一页