上一页 1 ··· 23 24 25 26 27 28 29 30 31 ··· 42 下一页
返回的是RMQ的下标,有个地方要注意,就是在rmq模板比较大小的地方要改成<=,要不然如果有一连串的相同数字的话本来是要取的,结果没取#include<string.h>#include<stdio.h>#include<math.h>const int M=1010;int min(int a,int b){return a<b?a:b;}int dp[20][M],LOG[M];void Make_Rmqindex(int n,char b[]){ int i,j; for(i=1;i<=n;i++) dp[0][i]=i; for(i Read More
posted @ 2011-11-20 12:02 Because Of You Views(760) Comments(2) Diggs(0) Edit
每年做一次完全背包,累加结果#include<stdio.h>#include<string.h>int dp[1000000],w[11],v[11];int sum,n,y;int max(int a,int b){return a>b?a:b;}void DP(){ int i,j,V=sum/1000; for(i=0;i<=V;i++) dp[i]=0; for(i=0;i<n;i++) for(j=w[i];j<=V;j++) dp[j]=max(dp[j],dp[j-w[i]]+v[i]); sum+=dp[V];}int main Read More
posted @ 2011-11-19 20:26 Because Of You Views(266) Comments(0) Diggs(0) Edit
看了别人的,就不讲了#include<stdio.h>#include<string.h>int dp[10000];int a[6];int min(int a,int b){ if(a==-1)return b; return a<b?a:b;}int main(){ int T; while(scanf("%d",&T)!=EOF) { while(T--){ int i,j; int upper = 0; for(i=0;i<6;i++) scanf("%d",&a[i]); upper= 10 Read More
posted @ 2011-11-19 17:11 Because Of You Views(259) Comments(0) Diggs(0) Edit
完全背包,注意初始化的细节dp【0】=0;这道题要求的是恰好装满背包的最小的价值,所以初始状态下,只有dp[0]满足条件,即容量为0的背包可能被价值为0的东西(即木有东西)装满背包,其他容量的背包均没有合法解,都是无穷大,之所以是恰好装满是因为贮蓄罐的增重是一定的#include<stdio.h>#include<string.h>int dp[10000];int w[505],v[505];int min(int a,int b){return a<b?a:b;}int main(){ int t,e,f,i,j,k,n; scanf("%d&quo Read More
posted @ 2011-11-19 15:53 Because Of You Views(848) Comments(1) Diggs(0) Edit
判断能不能将总的物品分两半,中间拆分的时候有点多重背包的思想#include<iostream>#include<string>#include<algorithm>using namespace std;int value[1005];int dp[60005];int num[7];int main(){ int i,j,d,ans,sum,ncase=1; while(scanf("%d%d%d%d%d%d",&num[1],&num[2],&num[3],&num[4],&num[5],&a Read More
posted @ 2011-11-19 15:11 Because Of You Views(226) Comments(0) Diggs(0) Edit
三种背包,每组至少、至多取一个或随意取多少注释在代码中#include<cstdio>#include<cstring>int dp[110][110];int max(int a,int b){ return a>b?a:b;}int main(){ int n,T,i,j,k,m,s,w,v; while(scanf("%d%d",&n,&T)!=EOF) { memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { scanf("%d%d",&m,& Read More
posted @ 2011-11-19 15:00 Because Of You Views(987) Comments(3) Diggs(0) Edit
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。算法这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有:f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于第k组}使用一维数组的伪代码如下:for所有的组kfor v=V..0for所有的i属于组kf[v]=max{f[v],f[v-c[i]]+w[i] Read More
posted @ 2011-11-19 02:09 Because Of You Views(444) Comments(0) Diggs(0) Edit
挺简单的DP,可是没有注意到数据会超范围,上官网搜了数据才知道,后来改成了__int64,发现还是不行,改成double,AC了带血的AC。。。#include<stdio.h>#include<string.h>double dp[110][15];int main(){ int k,n; int i,j; while(scanf("%d%d",&k,&n)!=EOF) { memset(dp,0,sizeof(dp)); for(i=1;i<=k+1;i++) dp[1][i]=1; for(i=2;i<=n;i++) Read More
posted @ 2011-11-18 20:14 Because Of You Views(240) Comments(0) Diggs(0) Edit
简单二分匹配,注意,输出的是n-最大匹配数#include<stdio.h>#include<string.h>#include<math.h>int match[110];bool map[110][110];struct point{ double x,y;}p[110],hole[110];double dis(point a,point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}bool vis[110];int m;bool dfs(int u){ int i; for(i= Read More
posted @ 2011-11-18 16:17 Because Of You Views(259) Comments(1) Diggs(1) Edit
其实可以二分的,听说直接输入一扇门的信息,做一次SCC也能爆过,就直接暴力了,呵呵~每个门有两把锁,这就有了一种关系,假设两把锁是a,b,那么不开a就一定要开b,不开b就一定要开a,即b'->a,a'->b;另外还有n对矛盾关系,用了a钥匙就不能用b钥匙,a->b',b->a'然后,强连通求解#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>using namespace std;const int M Read More
posted @ 2011-11-18 15:44 Because Of You Views(343) Comments(0) Diggs(0) Edit
上一页 1 ··· 23 24 25 26 27 28 29 30 31 ··· 42 下一页