摘要: 数位DP。dp[i][j][k]表示有i位,首位为j,有k个1的二进制数字有几个。 很容易写出递推式: dp[i][0][k]+=dp[i-1][0][k]; dp[i][0][k]+=dp[i-1][1][k]; dp[i][1][k]+=dp[i-1][0][k-1]; dp[i][1][k]+ 阅读全文
posted @ 2016-01-29 23:03 Fighting_Heart 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 简单DP。dp[i][j]表示完成第i段,有j体力的情况下,获得的最小时间, 然后就可以递推: //高速跑 if(j-s[i].f1>=0) dp[i][j-s[i].f1]=min(dp[i][j-s[i].f1],dp[i-1][j]+s[i].t1); //中速跑 dp[i][j]=min(d 阅读全文
posted @ 2016-01-29 20:47 Fighting_Heart 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 网络流,Dinic G++ 964ms水过,SAP 620ms AC 源点到每一个防晒霜建边,容量为cover[i]; 每一个防晒霜与它能保护的奶牛之间连一条边,容量为1; 每一个奶牛连到汇点一条边,容量为1。 最大流就是答案。 Dinic模板: #include<cstdio> #include< 阅读全文
posted @ 2016-01-29 15:26 Fighting_Heart 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 数位DP,题意转换一下就是说,其B进制表示的各位数字都只能是0和1。 求区间L....R之间的符合要求数字有几个,可以使用容斥原理。 计算小于X的符合要求的数有几个的时候,我们需要先找到比X小的最大的符合要求的数字,然后以这个数字往下推导,和之前做的数位DP方法一样了。 dp[i][j][k]表示的 阅读全文
posted @ 2016-01-29 11:02 Fighting_Heart 阅读(192) 评论(0) 推荐(0) 编辑