• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
 






Siriuslzx

 
 

Powered by 博客园
博客园 | 首页 | 新随笔 | 联系 | 订阅 订阅 | 管理
上一页 1 2 3 4 5 6 7 8 9 ··· 12 下一页

2012年11月8日

poj - 2373 Dividing the Path
摘要: 很久之前做的了,已经想不起思路了,容我日后补充。 1 #include <stdio.h> 2 #include <deque> 3 #include <algorithm> 4 #define inf 1000000000 5 using namespace std; 6 int n, L, a, b, cnt = 1; 7 int f[1000010]; 8 bool d[1000010]; 9 struct node10 {11 int s, e;12 }p[1001], P[1001];13 bool cmp(const node &a, c 阅读全文
posted @ 2012-11-08 22:41 Siriuslzx 阅读(192) 评论(0) 推荐(0)
 

2012年8月31日

用搜索做多重背包的心得
该文被密码保护。 阅读全文
posted @ 2012-08-31 11:00 Siriuslzx 阅读(0) 评论(0) 推荐(0)
 

2012年8月30日

zoj - 3626 Treasure Hunt I
摘要: 这题是在一个图中收集点上的价值,树形DP+01背包。题目的意思是在m天内要回到原点,但是按照前m/2天收集,后m/2天原路返回来做结果是对的。用dp[k][i]表示从k点出发,用 i 天能获得的最大值,状态转移方程为 dp[k][a] <?= dp[k][a - w[k][u] - b] + dp[u][b]。意思是总共a天,花了w[k][u]天从k走到u点(k与u相连),用b天从u开始收集,至于剩下的a -w[k][u] -b天可能用不到,就是用来凑数的。下面的代码很悲剧,时限2000它跑出个2001,因为里面有个错误。更奇葩的是OJ居然不给WA,也不给RE,我很想知道犯了这个错误是怎 阅读全文
posted @ 2012-08-30 11:02 Siriuslzx 阅读(239) 评论(0) 推荐(0)
 

2012年8月29日

hdu - 1059 Dividing
摘要: 多重背包问题,一般有三种思路优化:1.用2^n拆分数量,转化为01背包。2.当成完全背包来做,需要用一个数组记录每个物品的数量,当使用次数超过时结束。3.用单调队列优化(目前还不懂的说)。上次做男人八题里的coin时我用的是第二种思路,这次我用的是第一种。 1 #include <stdio.h> 2 #include <string.h> 3 bool dp[60006]; 4 int a[10],b[100]; 5 int cnt,sum; 6 bool read() 7 { 8 int i; 9 bool f = 0;10 sum = 0;11 for(i... 阅读全文
posted @ 2012-08-29 08:44 Siriuslzx 阅读(192) 评论(0) 推荐(0)
 
zoj - 3631 Watashi's BG
摘要: 0、1背包,直接做会超时。做了这题我才知道,01背包是能用搜索做的,搜索的时候剪枝很重要。(几个月后……)光棍节前夕,小T同志来找我,说他遇到了一个题解,里面说是受别人代码的启发,并附上原址,点开一看,居然是我?!我姓福了。真的很感谢这位兄弟,他尊重产权,更重要的是给了我信心。本来我都快要放弃了,现在我又坚定了信念,一定要好好搞下去。说实话,他的博客写得比我好,因为他详细地写出了思路。这时候小T 吐槽了:“其实你也是抄的。”好吧,我受之有愧,我是参考了江财大牛的思路,不过我的代码已经和他的不一样了,核心部分DFS做了逻辑上的改动。 1 #include <stdio.h> 2 #i 阅读全文
posted @ 2012-08-29 01:01 Siriuslzx 阅读(263) 评论(0) 推荐(0)
 
hdu - 3415 Max Sum of Max-K-sub-sequence
摘要: 题意:求一个环中最大区间和,区间长度 <= n。 用单调队列优化Dp,核心内容是dp[i] = max(sum[j]) - sum[i-1]。这题最后的输出有很多要求,如果有多个解,输出起始位置最小的;如果还有多个解,输出长度最小的。其实完全不用考虑,因为我遍历的时候就是按起始位置从小到大的,如果一个解和最优解相同,并不更新,记录的就是起始最小的结果。另一个要求亦然。 1 #include <stdio.h> 2 #include <string.h> 3 const int N = 100010; 4 const int INF = 1000000000; 5 阅读全文
posted @ 2012-08-29 00:55 Siriuslzx 阅读(228) 评论(0) 推荐(0)
 
poj - 3039 Margaritas on the River Walk
摘要: 稍微复杂一些的0、1背包,要把背包尽可能装满,直到再也装不下任何物品,求总装法。这题是不用考虑W的,先把V升序排序,从小到大枚举,当前物品为剩下未使用的物品中体积最小的,那么比当前小的一定是要使用的。这种思路是n^3的,后面的物品会被重复计算,如果从后往前枚举就能避免这个问题,复杂度为n^2。 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 int dp[1005],sum[35],w[35]; 6 int main() 7 阅读全文
posted @ 2012-08-29 00:48 Siriuslzx 阅读(186) 评论(0) 推荐(0)
 
poj - 2828 Buy Tickets
摘要: 题目给出插队的过程,求最后队的序列。我当初想开一个大数组模拟,用1表示有人,0表示没人,从后往前推,每确定一个人,就把他所在位置的1改为0,剩下的人再根据0,1算序号。这个想法我放弃了,因为复杂度是O(n)的。后来我才恍然大悟,线段树不就是把对区间的操作从O(n)化为O(logn)的么?这样问题就解决了。 1 #include <stdio.h> 2 #include <string.h> 3 const int N = 200010; 4 int p[N],w[N],order[N]; 5 int tree[N<<2],D; 6 void update(i 阅读全文
posted @ 2012-08-29 00:38 Siriuslzx 阅读(135) 评论(0) 推荐(0)
 
poj - 1067 取石子游戏
摘要: Poj中少有的中文题。这题其实有个术语叫“威佐夫博弈”,我当初找规律时试过二进制、斜率,没想到第三次试黄金分割就对了。 说说我的思路吧,我会尽量用通俗的语言,因为有时候看到术语我会头晕。这题属于最简单的博弈类型,“状态争夺”,就是只有两个人,要想赢就要抢夺一个特殊状态,而一般谁面对这个状态谁倒霉,所以要把这个留给对手,它的术语叫“必败态”。举个例子,一堆石子,每次能拿走1,2,3块,两人轮流拿,取走最后所有石子的人胜。那必败态就是石子数为4n,对方面对这个状态,无论怎么取,你都能相应地取来维持数量为4的倍数,直到只剩4个,然后呢?没有然后了。顺便说一下,结束的状态也属于必败态,比如没有石子了, 阅读全文
posted @ 2012-08-29 00:31 Siriuslzx 阅读(469) 评论(0) 推荐(0)
 
poj - 2243 Knight Moves
摘要: 这题和poj 1915一样,用bfs做走马步。现在再看当时的代码,真是好幼稚啊。 1 #include <stdio.h> 2 #include <string.h> 3 int X[] = {-2,-2,-1,-1,1,1,2,2}, 4 Y[] = {-1,1,-2,2,-2,2,-1,1}; 5 struct Point 6 { 7 int x,y; 8 void init(int a,int b) 9 {x = a; y = b;}10 }q[70],s,t;11 int head,tail,map[9][9];13 void bfs()14 {15 ... 阅读全文
posted @ 2012-08-29 00:26 Siriuslzx 阅读(188) 评论(0) 推荐(0)
 
上一页 1 2 3 4 5 6 7 8 9 ··· 12 下一页