07 2013 档案
摘要:状态转移方程 s[k][i][j]=max{s[k-1][i-1][j-1],s[k-1][i][j-1],s[k-1][i-1][j],s[k-1][i][j]}+a[i][k-i]+a[j][k-j] (ij) s[k][i][j]=s[k-1][i-1][j]+a[i][k-1] 1 #include 2 #include 3 4 int main() 5 { 6 int n,tag,i,j,k,a[11][11],s[22][11][11]; 7 scanf("%d",&n); 8 memset(a,0,11*11*sizeof(int));...
阅读全文
摘要:利用性质 A*B mod C= (A mod C*B mod C) mod C (A+B) mod C = (A mod C+B mod C) mod C状态转移方程 s[i,(j-a[i] mod k) mod k]=s[i-1,j] (s[i-1,j]=1) s[i,(j+a[i] mod k) mod k]=s[i-1,j] (s[i-1,j]=1) 1 #include 2 #include 3 4 5 int main() 6 { 7 int l,i,j,k,n,tag,v[10001],s[2][201]; 8 scanf("%d"...
阅读全文
摘要:状态转移函数 s[i][j]=max{s[i-1][k]}+a[i][j] i 2 #include 3 4 5 // s[i][j]=max{s[i-1][t]+a[i][j]} 6 int main() 7 { 8 int i,j,k,f,v,tag,a[101][101],s[101][101],w[101][101],t[101]; 9 scanf("%d %d",&f,&v);10 for(i=1;i1)46 {47 j--;48 t[j]=w[j+1][t[j+1]];49 }50 printf(...
阅读全文
摘要:根据题意,可从后向前递推求出 sum[i][j]即从串i到j中有单词的最大个数状态转移方程opt[i][j]=max{opt[i][t]+sum[t+1][j]} i,j表示到下标j形成了i个划分 1 #include 2 #include 3 4 5 #define N 200+10 6 7 8 char s[N],s1[21],w[7][21]; 9 10 11 int cmp(char *s1,char *s2,int i,int j)12 {13 int l1=strlen(s1);14 for(int k=0;kj-i||s1[k]!=s2[i+k])17...
阅读全文
摘要:1 #include 2 #include 3 4 #define N 100+1 5 int main() 6 { 7 int i,j,tag,k,n,v[N*2],s[N*2][N*2]; 8 scanf("%d",&n); 9 for(i=1;i<=n;i++)10 {11 scanf("%d",&v[i]);12 v[i+n]=v[i];13 }14 for(i=1;i<=2*n;i++)15 {16 s[i][i]=0;17 }18 for(i=1;i<n;i++...
阅读全文
摘要:先将题目中的还变成链,把环截断,复制一份放在后面形成一个两倍的链,max[i][j]表示从i到j最大得分,同理有min(i,j),sum(i) 表示到i的石子串的总数量。状态转移方程max[i][j]=max{max[i][k]+max[k+1][j]}+sum[j]-sum[i-1] min[i][j]=min{min[i][k]+min[k+1][j]}+sum[j]-sum[i-1] 1 #include 2 3 int main() 4 { 5 int i,j,k,tag1,tag2,n,v[202],sum[202],max[202][202],min[20...
阅读全文
摘要:状态转移方程 L[i]=L[i-w[j]]+v[j] if(L[i] 2 #include 3 4 #define N 100+1 5 int main() 6 { 7 int i,j,k,n,m,l,w[N],v[N],L[2001],L1[2001]; 8 scanf("%d %d %d",&n,&m,&l); 9 for(i=1;i=w[i];j--)16 {17 if(L[j]m)20 continue;21 L[j]=L[j-w[i]]+v[i];22 ...
阅读全文
摘要:状态转移方程 s[i][j]=s[i-rmb[k]][j-rp[k]]+1 if(s[i][j] 2 #include 3 4 5 #define N 100+1 6 7 int main() 8 { 9 int n,i,j,k,m,r,rmb[N],rp[N],time[N],s[N][N],c[N][N];10 scanf("%d",&n);11 for(i=1;i=rmb[i];j--)21 {22 for(k=r;k>=rp[i];k--)23 {24 25 ...
阅读全文
摘要:将字符串与本身的反转字符串求最长公共子序列。 1 #include 2 #include 3 4 int main() 5 { 6 char s[5001],r[5001]; 7 short v[2][5001]; 8 int i,j,n; 9 scanf("%s",s);10 strcpy(r,s);11 strrev(r);12 if(s[0]==r[0])13 {14 v[0][0]=1;15 }16 else17 {18 v[0][0]=0;19 }20 ...
阅读全文
摘要:与数塔问题相似,状态转移方程,s[i][j]=max{s[i+1][k]} j-2 2 3 4 int main() 5 { 6 long v[201][201]; 7 int i,j,k,m,n; 8 scanf("%d %d",&m,&n); 9 for(i=1;i=1;i--)17 {18 for(j=1;j0)21 {22 k=v[i+1][j-2];23 }24 if(j-1>0)25 {26 ...
阅读全文
摘要:从下向上分析 每个状态s[i][j]代表从底部到这个位置的最大值,状态转移方程 s[i][j]=max{s[i+1][j],s[i+1][j+1]}+w[i][j] 1 #include 2 3 int main() 4 { 5 int i,j,k,n; 6 char v[1001][1001]; 7 long s[2][1001]; 8 scanf("%d",&n); 9 for(i=1;i=1;i--)17 {18 for(j=1;js[(i+1)%2][j+1])21 s[i%2][j]=s[(i+...
阅读全文
摘要:每个状态表示到达这个状态所挖地雷的最大数,状态转移方程 s[i]=max{s[j]}+w[i] if(v[i][j]=1) 1 #include 2 3 int main() 4 { 5 int i,j,k,n,w[21],s[21],y[21]; 6 bool v[21][21]; 7 scanf("%d",&n); 8 for(i=1;is[i])28 {29 s[i]=s[j]+w[j];y[i]=j;30 }31 }32 y[1]=0;33 s[n]+=w[n];34...
阅读全文
摘要:设置一个状态数组表示到达这个重量的一张牌的序号,状态转移方程pos[i][j]=i {if(pos[i][j-v[i]]!=0)} 1 #include 2 #include 3 4 int main() 5 { 6 int tag,t,n,i,j,k,v[101]; 7 char pos[2][100001],pos1[101]; 8 scanf("%d",&t); 9 scanf("%d",&n);10 memset(pos[0],0,sizeof(char)*(t+1));11 j=0;12 for(i=1;i=0)25 ...
阅读全文
摘要:每个状态代表可表示的种类数 状态转移方程 s[j]=s[j-c[i]]+s[j] 1 #include 2 #include 3 4 int main() 5 { 6 int v,n,i,j,k,c[26],s[10001]; 7 scanf("%d %d",&v,&n); 8 for(i=1;i=0) 19 if(s[j-c[i]]>0)20 s[j]+=s[j-c[i]];21 }22 }23 printf("%d\n",s[n]);24 while(true);25 ...
阅读全文
摘要:1 #include 2 #include 3 4 struct thing 5 { 6 int w[3],v[3]; 7 int size; 8 }; 9 10 int main()11 {12 struct thing t[61];13 int i,tag,tag2,j,k,n,m,v,w,p;14 int s[2][32001];15 memset(s[0],0,sizeof(int)*32001);16 scanf("%d %d",&n,&m);17 tag=1;18 for(i=1;i=0&&s[(i-1)%...
阅读全文
摘要:0/1背包问题,状态转移方程 if(j-w[i]>=0) s[i][j]=max(s[i-1][j],s[i-1][j-w[i]]+w[i]*v[i]) else s[i][j]=s[i-1][j]可能有超内存的问题,实际上只需要两个转移的状态就可以了。 1 #include 2 #include 3 4 5 int main() 6 { 7 int i,tag,j,n,m,w[26],v[26],s[2][30001]; 8 scanf("%d %d",&n,&m); 9 for(i=1;is[(i-1)%2][j])18 {19 ...
阅读全文
摘要:根据草药的不可重复性而作为最外层循环,状态转移方程if(j>=w[i]) s[i][j]=max(s[i-1][j],s[i-1][j-w[i]+v[i]) else s[i][j]=s[i-1][j] 1 #include 2 #include 3 4 5 6 int main() 7 { 8 int t,m,i,j,w[101],v[101],s[101][1001]; 9 scanf("%d %d",&t,&m);10 for(i=1;i<=m;i++)11 {12 scanf("%d %d",&w[i],&am
阅读全文
摘要:把积木可搭建的最大高度看做背包的载重,每块积木的高度就是物品的重量,也就是用给定的物品装指定的包,使每个包装的物品一样多,且在符合条件的前提下尽量多。 1 #include 2 #include 3 #include 4 5 int cmp(const void *a,const void *b) 6 { 7 return *(int *)a-*(int *)b; 8 } 9 10 int main()11 {12 int n,i,j,k;13 int val[101],max[101];14 bool val1[101][10001];15 s...
阅读全文

浙公网安备 33010602011771号