上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 22 下一页
摘要: 思路:把每行的数当做是一个二进制串,0不变,1变或不变,找出所有的合法二进制形式表示的整数,即相邻不同为1,那么第i-1行与第i行的状态转移方程为dp[i][j]+=dp[i-1][k];这个方程得前提条件是num[i][j]&num[i-1][k]==0,也就是他们表示的二进制形式相与为0,那么就不存在相邻为1的情况。#include#include#include#include#define Maxn 13#define inf 0x7fffffffusing namespace std;__int64 dp[Maxn][1=1;i--) sum+=graphic[... 阅读全文
posted @ 2013-08-06 10:45 fangguo 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 思路:我只想说,while(head#include#include#include#include#define Maxn 110#define Maxm 10010#define inf 1000000000using namespace std;int dp[Maxn][Maxm],sum[Maxm],num[Maxn][Maxm];int que[Maxm*5];void init(){ memset(sum,0,sizeof(sum)); memset(num,0,sizeof(num));}inline int ReadInt(){ int flag = 1; ... 阅读全文
posted @ 2013-08-05 21:47 fangguo 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 思路:动态方程很容易想到dp[i][j]=max(dp[i][j],dp[i-w-1][j-k]-k*ap[i],dp[i-w-1][j+k]+k*bp[i]);dp[i][j]表示第i天拥有j个石头的最大价值。其实每次求得都是最有策略,所有dp[i-w-1]表示的就是i-w-1以前的最优,故不同往前遍历。那么主要需要优化的是:对于买石头,容量为j时,维护从j-k到j的转移最大值。即从哪个容量转移过来能得到最大效益。对于卖石头,容量为j时,维护从j+k到j的转移最大值。即从哪个容量转移过来能得到最大效益。见代码:#include#include#include#include#include# 阅读全文
posted @ 2013-08-05 15:06 fangguo 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 思路:我们用单调队列保存2*b#include#include#include#include#define inf 10000010#define Maxn 1010#define Min(a,b) (a)>(b)?(b):(a)using namespace std;int dp[1000010],que[1000010],head,rear,interv[1200010];struct Inter{ int l,r; int operator=inf) printf("-1\n"); else printf("%d\n",dp[l]); } 阅读全文
posted @ 2013-08-05 10:52 fangguo 阅读(262) 评论(0) 推荐(0) 编辑
摘要: 思路:如题#include#include#include#include#include#define Maxm 100010#define eps 1e-4using namespace std;int vi[220],head[220],e,n,m,id[220],lab,num,dfn[220],low[220],Stack[220],top;double Max;struct Point{ double x,y;}p[210];struct Edge{ int u,v,next;}edge[Maxm];void init(){ memset(vi,0,sizeof(... 阅读全文
posted @ 2013-08-03 14:47 fangguo 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 思路:直接引用论文的话。暂时先不考虑“使剩下的物品都放不下”的条件,那就是求 0-1 背包的所有可行方案。 用 Fi[j]表示前 i 件物品中选若干件总体积为 j 的方案数,初始为 F0[0]=1,转移方程是: Fi[j] = Fi-1[j] (Vi>j) Fi[j] = Fi-1[j] + Fi-1[j-Vi](j>=Vi) 显然这个算法的效率是 O(n*C)的,它计算了所有装放背包的方案数。 现在考虑“使剩下的物品都放不进去”的条件,如果剩下的物品中体积最小为 v,那么方案数就是 sum{ Fn[j] }(C>=j>C-v)。前提是我们事先确定了剩下中体积最小的是哪 阅读全文
posted @ 2013-08-03 12:24 fangguo 阅读(297) 评论(0) 推荐(0) 编辑
摘要: 思路:把价值看做体积,而价值的大小还是其本身,那么只需判断1-m中的每个状态最大是否为自己,是就+1;#include#include#include#include#define Maxn 100010#define Max(a,b) (a)>(b)?(a):(b)using namespace std;int dp[Maxn],num[110],v[110];struct Que{ int pos,val;}que[Maxn*2];int main(){ int n,m,i,j; while(scanf("%d%d",&n,&m)!=EOF,n&a 阅读全文
posted @ 2013-08-03 10:13 fangguo 阅读(353) 评论(1) 推荐(1) 编辑
摘要: 思路:这个方法要看《浅谈几类背包问题》这篇论文。#include"stdio.h"#define Max(a,b) (a)>(b)?(a):(b)int f[31],k[8];int main(){ int i,j,m,Case=0; while(scanf("%d%d%d%d%d%d",&k[1],&k[2],&k[3],&k[4],&k[5],&k[6])!=EOF,k[1]|k[2]|k[3]|k[4]|k[5]|k[6]) { for(i=0;i0) { if(k[i]=m*i;j--) .. 阅读全文
posted @ 2013-08-02 20:51 fangguo 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 思路:裸的单调队列。#include#include#include#include#define Maxn 1000010using namespace std;int n,k,que[Maxn],num[Maxn],head,rear;int main(){ int i,j,a; while(scanf("%d%d",&n,&k)!=EOF) { head=1; rear=0; for(i=1;i=head&&num[que[rear]]>=num[i]) rear--; que... 阅读全文
posted @ 2013-08-02 16:21 fangguo 阅读(144) 评论(0) 推荐(0) 编辑
摘要: #include#include#include#include#define Maxn 100010using namespace std;__int64 ans=0;int Stack[Maxn],top;int main(){ int n,i,j,a; while(scanf("%d",&n)!=EOF) { ans=0; top=0; for(i=1;i0&&Stack[top]<=a) top--; ans+=(__int64)top; Stack[+... 阅读全文
posted @ 2013-08-02 15:28 fangguo 阅读(134) 评论(0) 推荐(0) 编辑
上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 22 下一页