摘要:
经过两年左右,本博客重新启用。 阅读全文
摘要:
这是楼教主的男人八题之一。很高兴我能做八分之一的男人了。题目大意:求有n个顶点的连通图有多少个。解法:1、 用总数减去不联通的图(网上说可以,我觉得时间悬)2、 用动态规划(数学递推)。网上讲的方法我觉得非常难懂,但好像也没有更好的表示。我就说一下吧:用dp[i]表示i个顶点时的连通图的总数。考虑将... 阅读全文
摘要:
这题离散化+并查集,没看出关dp什么事。(那他为什么放到dp里面)用Si记录前i项的和。拆成两个点,i*2表示与第i个相同,i*2+1表示与第i个不同。用并查集判断。区间[a,b]就可以看成Sb-S(a-1),用并查集保存S的奇偶性的相同和相异情况。注意数组开时要开成4*n+4,我在这里RE了一次代码:#include#include#includeusing namespace std;struct dt{ int id,p,l;}a[10100];int fa[20100];bool d[5100],f;bool cmp1(dt x,dt y){ return x.p<y.p;}bo 阅读全文
摘要:
用动态规划,dp[a][b][c]表示从位置最大的车在a(注意不是第一辆车),第二的车在b,第三的车在c开始最少需要的时间。方程:dp[a][b][c]=max{dp[a+1][b][c], //a到a+1 dp[a+1][a][c], //b到a+1 dp[a+1][a][b], //c到a+1用滚动数组优化时空,status应该能到90左右代码:#include#includeusing namespace std;int dp[30][30]={0},d[30][30];int min(int x,int y){ return (x=0;a--){ for(int b=0;b<=a 阅读全文
摘要:
这道题我有很多要说首先是基础的解题思路:树形dp(dfs)用dp[i]保存以i为根结点的子树的大小(含i)balance(i)=max{n-dp[i],max{dp[j]}(j is a son of i}O(n)这题我RE了5次,WA了5次,AC来之不易啊反观10次unACs(我承认是我创的,自己能看懂),发现只有一个问题:清零短短3行字,调了我2小时!!!以后注意吧。。。吐槽多了,赶快上代码:#include#includeusing namespace std;int n,dp[20100],to[40100],top,next[40100],first[20100];int min=1 阅读全文
摘要:
二次dp,还算好想。先第一遍dp找出最后一个数字最小是几。dpf[i]=max{j}+1(dpf[j],dpf[j]+1,…,j位组成的数字小于j+1,j+2,…,i位组成的数字。在第二遍dp,找出第一个数字最大是几。dpb[i]=max{j}(I,i+1,…,j为组成的数字小于j+1,j+2,…,dpb[i+2]位组成的数字。按轨迹输出。!记住:每次都要将两个数组清零!(坑了我半天)代码:#include#includeusing namespace std;int dpf[90]={0},dpb[90]={0};char a[90];int max(int x,int y){ return 阅读全文
摘要:
此题亦一眼看出算法,一次AC。没什么好讲的,就是一个普通的树形动规。用dp[n][0]表示n号顶点不取时的最大值,dp[n][1]表示n号顶点取时的最大值。dp[n][0]=max{dp[x][0],dp[x][1]}(x is son of n)dp[n][1]=max{sigma(x1,x2,…,xk)}(x1,x2,…,xk are k sons of n)本来能写O(n)的算法,偷懒写了O(n^2)的算法,也能AC优化:用邻接链表,O(n)(我没用)代码:#include#includeusing namespace std;int n,x[1001],y[1001],fa[1001] 阅读全文
摘要:
很高兴,这道题刚编译成功提交就AC了。简单的多重背包,标算估计是5、6维动规。其实可以通过6进制压成一维。判定是一个特价方式是否可行只需自己推一下就行了,很简单(对应位上的数目标不小于特价所需条件)。代码:#includeusing namespace std;int t[10],map[1000],l[10],c[120],p[120],dp[300000];void init(){ t[0]=1; for(int i=1;iy)return 0; for(int i=9;i>=0;i--){ if(x/t[i]>y/t[i])return 0; x%=t[i],y%=t[i]; 阅读全文
摘要:
简单的dp忘了\n,调了半天(目测不是第一次了)直接贴代码:#include#includeusing namespace std;char s[120];int dp[120][120]={0};int min(int x,int y){ return (x>y)?y:x;}void solve(int x,int y){ if(dp[x][y]==0){ for(int i=x;i<=y;i++) printf("%c",s[i]); return; } if(y==x){ if(s[x]=='(' || s[x]==')') 阅读全文
摘要:
昨天晚上看的题。说实话,我一眼就看出了是二分图,再一眼就看出了是二分图+dp(01背包)。但悲剧的是我一眼看出的算法是正确的,但我总以为它是错误的,浪费了很长时间像其他算法(TAT)。今天终于把代码打了出来,刚开始01背包的优化后来发现是错误的,忘记删了,导致WA一次。吃晚饭时突然发现了,便AC。2013-6-29代码:#include#includeusing namespace std;int n,col[101],w[202],m=0,dp[101][101],pre[101][101];bool map[101][101]={0},vis[202]={0},f=0;void dfs(i 阅读全文