09 2013 档案

摘要:题意:略。思路:进行两次dp。第一次dp从前向后,用dp[x]表示从第x位向前dp[x]位可构成一个数字,且与前面的数组符合题意要求。最后求的dp[n]即为最后一个数字的长度。而题目还有要求,所有解中输出前面数字最大的一个。因此还需要进行一次dp,从后向前。具体看代码吧,当初也是看别人代码才看懂的。 1 #include 2 #include 3 char num[85]; 4 int dp[85], n; 5 bool judge(int st1,int len1,int st2,int len2) 6 { 7 while (num[st1] == '0' && 阅读全文
posted @ 2013-09-12 19:28 fenshen371 阅读(390) 评论(0) 推荐(0)
摘要:题意:略。思路:这是个删边的博弈游戏。关于删边游戏的预备知识:http://blog.csdn.net/acm_cxlove/article/details/7854532学习完预备知识后,这一题就不难了。首先,用tarjan算法找到每棵树中的双连通分量(即树枝上的多边形),根据Fusion Principle,如果多边形有奇数条边,可以简化为1条边,如果有偶数条边,则可以简化为1个点。代码中使用了vis数组,对于前者,使环内所有的点(包括悬挂点)的vis值为1,后面计算sg值时便不会再进行遍历这些点;对于后者,除了悬挂点和多边形内与悬挂点相邻的一点(相邻点中只取一个)外,多边形内其他点vis 阅读全文
posted @ 2013-09-05 21:01 fenshen371 阅读(390) 评论(0) 推荐(0)