动态规划索引

1.  资源问题1

                 -----机器分配问题

                 F[I,j]:=max(f[i-1,k]+w[i,j-k])

 

           2.  资源问题2

                 ------01背包问题

                F[I,j]:=max(f[i-1,j-v[i]]+w[i],f[i-1,j]);

 

           3.  线性动态规划1

                 -----朴素最长非降子序列

                F[i]:=max{f[j]+1}

 

           4.  剖分问题1

                 -----石子合并

                 F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]);

 

           5.  剖分问题2

                 -----多边形剖分

                 F[I,j]:=min(f[j,k]+f[k,j]+a[k]*a[j]*a[i]);

 

           6.  剖分问题3

                 ------乘积最大

                 f[i,j]:=max(f[k,j-1]*mult[k,i]);

 

           7.  资源问题3

              -----系统可靠性(完全背包)

                 F[i,j]:=max{f[i-1,j-c[i]*k]*P[I,x]}

 

           8.  贪心的动态规划1

                 -----快餐问题

                   F[i,j]表示前i条生产线生产j个汉堡,k个薯条所能生产的最多饮料,

                      则最多套餐ans:=min{j div a,k divb,f[I,j,k] div c}

                  F[i,j,k]:=max{f[i-1,j',k']+(T[i]-(j-j')*p1-(k-k')*p2) div p3}  

       时间复杂度 O(10*100^4)

 

           9.  贪心的动态规划2

                 -----过河 f[i]=min{{f(i-k)} (not stone[i])

                                         {f(i-k)}+1} (stone[i]);  +贪心压缩状态

 

           10.      剖分问题4

                 -----多边形-讨论的动态规划

                 F[i,j]:=max{正正 f[I,k]*f[k+1,j];

                                 负负g[I,k]*f[k+1,j];

                           正负g[I,k]*f[k+1,j];

                          负正f[I,k]*g[k+1,j];}  gmin

 

           11.      树型动态规划1

                 -----加分二叉树 (从两侧到根结点模型)

                  F[I,j]:=max{f[I,k-1]*f[k+1,j]+c[k]}

 

           12.      树型动态规划2

                 -----选课 (多叉树转二叉树,自顶向下模型)

                         F[I,j]表示以i为根节点选j门功课得到的最大学分

                   f[i,j]:=max{f[t[i].l,k]+f[t[i].r,j-k-1]+c[i]}

 

           13.      计数问题1

                 -----砝码称重

                 const w:array[1..n] of shortint=(12351020)

                 //不同砝码的重量

                 var a:array [1..n] of integer;

                 //不同砝码的个数

                 f[0]:=1; 总重量个数(Ans)

                 f[1]:=0; 第一种重量0;

                

                 f[f[0]+1]=f[j]+k*w[j];

                 (1<=i<=n;  1<=j<=f[0]; 1<=k<=a[i];)

 

           14.      递推天地1

                 ------核电站问题

                 f[-1]:=1;  f[0]:=1;                       

                 f[i]:=2*f[i-1]-f[i-1-m]        

 

           15.      递推天地2

                 ------数的划分

                 f[i,j]:=f[i-j,j]+f[i-1,j-1];

 

           16.      最大子矩阵1

                 -----一最大01子矩阵

                 f[i,j]:=min(f[i-1,j],v[i,j-1],v[i-1,j-1])+1;   

                 ans:=maxvalue(f);                            

 

           17.      判定性问题1

                 -----能否被4整除

                 g[1,0]:=true;g[1,1]:=false; g[1,2]:=false; g[1,3]:=false;

                 g[i,j]:=g[i-1,k] and((k+a[i,p]) mod 4 = j)

 

           18.      判定性问题2

                 -----能否被k整除

                 f[I,j±n[i] mod k]:=f[i-1,j];      -k<=j<=k; 1<=i<=n

 

           20.      线型动态规划2

                 -----方块消除游戏

                 f[i,i-1,0]:=0

                 f[i,j,k]:=max{f[i,j-1,0]+sqr(len(j)+k),

                            f[i,p,k+len[j]]+f[p+1,j-1,0]}

                 ans:=f[1,m,0]

 

           21.      线型动态规划3

                 -----最长上升公共子串,LCS问题

                 f[i,j]={0       (i=0)&(j=0);

                      f[i-1,j-1]+1  (i>0,j>0,x[i]=y[j]);

                      max{f[i,j-1]+f[i-1,j]}}(i>0,j>0,x[i]<>y[j]);

 

       let(n>m); (n=length(a); m:=length(b));

       for i:= 1 to n do

             begin

                   x:=-1;  p:=1;

                   forj:= 1 to m do

                     if a[i]=b[j] then

                      begin

                           x:=p;

                           while flag[j,x] and (f[j,x]<a[i]) do inc(x);

                           p:=x;

                           f[j,x]:=a[i];

                           flag[j,x]:=true;

                     end

                   else

                         if (x<>-1) and flag[j-1,x] and ((not flag[j,x]) or(f[j-1,x]<f[j,x])) then

                         begin

                             f[j,x]:=f[j-1,x];

                             flag[j,x]:=true;

                         end else x:=-1;

             end;

 

            ok:=false;

             for i:= m downto 1 do

                   ifflag[m,i] then begin writeln(i); ok:=true; break;  end;

       if not ok then writeln(0);

 

           22.      最大子矩阵2

                 -----最大带权01子矩阵O(n^2*m)

                 枚举行的起始,压缩进数列,求最大字段和,遇0则清零

f[i]:=max(f[i-1]+a[i],a[i])

           readln(n,m);

           fori:= 1 to n do for j:= 1 to m do read(a[i,j]);

           ans:=-maxlongint;

           fori:= 1 to n do

           begin

               fillchar(b,sizeof(b),0);

               fillchar(u,sizeof(u),0);

               forj:= i to n do

               begin

                      max:=0;

                      fork:= 1 to m do

                      begin

                          if (a[j,k]<>0) and (not u[k]) then

                          begin

                                  inc(b[k],a[j,k]);

                                  inc(max,b[k])

                          end

                          else

                          begin

                              max:=0;

                              u[k]:=true;

                          end;

                          ifmax>ans then ans:=max;

                      end; 

               end;

           end;

 

23.      资源问题4

                 -----装箱问题(判定性01背包)

                 f[j]:=(f[j] or f[j-v[i]]);

          

     :  这里将数字三角形的意义扩大

       凡状态转移为图形,跟其上面阶段和前面状态有关都叫数字三角形:)

 

           24.      数字三角形1

                 -----朴素の数字三角形

                 f[i,j]:=max(f[i+1,j]+a[I,j],f[i+1,j+1]+a[i,j]);

 

           25.      数字三角形2

                 -----Hill

 

           26.      双向动态规划1

                 数字三角形3

                 -----小胖办证

                 f[i,j]:=max(f[i-1,j]+a[i,j],f[i,j-1]+a[i,j],f[i,j+1]+a[i,j])//+暴力动态规划

 

           27. 数字三角形4

                 -----过河卒

                 //边界初始化

                 f[i,j]:=f[i-1,j]+f[i,j-1];

 

           28.      数字三角形5

                 -----朴素的打砖块

                 f[i,j,k]:=max(f[i-1,j-k,p]+sum[i,k],f[i,j,k]);            

 

           29.      数字三角形6

                 -----优化的打砖块

                 f[I,j,k]:=max{g[i-1,j-k,k-1]+sum[I,k]}

 

           30.      线性动态规划3

                 -----打鼹鼠

                 f[i]:=f[j]+1;(abs(x[i]-x[j])+abs(y[i]-y[j])<=t[i]-t[j])

 

           31.      树形动态规划3

                 -----贪吃的九头龙

 

           32.      状态压缩动态规划1

                 -----炮兵阵地

                 Max(f[Q*(r+1)+k],g[j]+num[k])

                 If (map[i] and plan[k]=0) and

               ((plan[P] or plan[q]) andplan[k]=0)

 

           33.      递推天地3

                 -----情书抄写员

                 f[i]:=f[i-1]+k*f[i-2]

 

           34.      递推天地4

                 -----错位排列

                 f[i]:=(i-1)(f[i-2]+f[i-1]);

                 f[n]:=n*f[n-1]+(-1)^(n-2);

 

           35.      递推天地5

                 -----直线分平面最大区域数

                 f[n]:=f[n-1]+n

                     :=n*(n+1) div 2 + 1;

 

           36.      递推天地6

                 -----折线分平面最大区域数

                 f[n]:=(n-1)(2*n-1)+2*n;

 

           37.      递推天地7

                 -----封闭曲线分平面最大区域数

                 f[n]:=f[n-1]+2*(n-1)

                     :=sqr(n)-n+2;

                

           38 递推天地8

                 -----凸多边形分三角形方法数

                 f[n]:=C(2*n-2,n-1) div n;

                 对于k边形

                 f[k]:=C(2*k-4,k-2) div (k-1);//(k>=3)

 

           39 递推天地9

                 -----Catalan数列一般形式

                 1,1,2,5,14,42,132

                 f[n]:=C(2k,k) div (k+1);

 

           40 递推天地10

                 -----彩灯布置

                 排列组合中的环形染色问题

                 f[n]:=f[n-1]*(m-2)+f[n-2]*(m-1);  (f[1]:=m; f[2]:=m(m-1);

 

           41 线性动态规划4

                 -----找数

                 线性扫描

                  sum:=f[i]+g[j];

               (if sum=Aim then getout; if sum<Aim theninc(i) else inc(j);)

 

           42 线性动态规划5

                 -----隐形的翅膀

            min:=min{abs(w[i]/w[j]-gold)};

             if w[i]/w[j]<gold then inc(i)else inc(j);

          

           43 剖分问题5

                 -----最大奖励

                 f[i]:=max(f[i],f[j]+(sum[j]-sum[i])*i-t

 

           44 最短路1

                 -----Floyd

                 f[i,j]:=max(f[i,j],f[i,k]+f[k,j]);

 

45    剖分问题6

-----H的小屋

F[l,m,n]:=f[l-x,m-1,n-k]+S(x,k);

function GetS(l,n:longint):extended;

begin

    if (n=0) or(n>l) then exit(WQ)

    else getS:=(lmod n)*k2*sqr(l div n+1)+

               (n-lmod n)*k2*sqr(l div n)+

              k1*sqr(l);

end;

if x+S(x,k)>=f[i,q,p] then break elsef[i,q,p]:=x+S(x,k);inc(k);

 

46    计数问题2

-----陨石的秘密(排列组合中的计数问题)

Ans[l1,l2,l3,D]:=f[l1+1,l2,l3,D+1]-f[l1+1,l2,l3,D];

F[l1,l2,l3,D]:=Sigma(f[o,p,q,d-1]*f[l1-o,l2-p,l3-q,d]);

 

47    线性动态规划

------合唱队形

两次F[i]:=max{f[j]+1}+枚举中央结点

 

48    资源问题

------明明的预算方案:加花的动态规划

f[i,j]:=max(f[i,j],f[l,j-v[i]-v[fb[i]]-v[fa[i]]]+v[i]*p[i]+v[fb[i]]*p[fb[i]]+v[fa[i]]*p[fa[i]]);

 

49    资源问题

-----化工场装箱员

50    树形动态规划

-----聚会的快乐

f[i,2]:=max(f[i,0],f[i,1]);

f[i,1]:=sigma(f[t[i]^.son,0]);

f[i,0]:=sigma(f[t[i]^.son,3]);

 

 

51   树形动态规划

-----皇宫看守

f[i,2]:=max(f[i,0],f[i,1]);

f[i,1]:=sigma(f[t[i]^.son,0]);

f[i,0]:=sigma(f[t[i]^.son,3]);

 

52   递推天地

-----盒子与球

f[i,1]:=1;

f[i,j]:=j*(f[i-1,j-1]+f[i-1,j]);

 

53    双重动态规划

-----有限的基因序列

f[i]:=min{f[j]+1}

g[c,i,j]:=(g[a,i,j] and g[b,i,j]) or (g[c,i,j])

 

54    最大子矩阵问题

-----居住空间

            f[i,j,k]:=min(min(min(f[i-1,j,k],f[i,j-1,k]),

                               min(f[i,j,k-1],f[i-1,j-1,k])),

                               min(min(f[i-1,j,k-1],f[i,j-1,k-1]),

                               f[i-1,j-1,k-1]))+1;

55    线性动态规划

------日程安排

f[i]:=max{f[j]}+P[I]; (e[j]<s[i])

 

56    递推天地

------组合数

C[I,j]:=C[i-1,j]+C[I-1,j-1]
C[I,0]:=1

          

57    树形动态规划

-----有向树k中值问题

F[I,r,k]:=max{max{f[l[i],I,j]+f[r[i],I,k-j-1]},f[f[l[i],r,j]+f[r[i],r,k-j]+w[I,r]]}

 

58   树形动态规划

-----选课

F[I,j]:=w[i](if iP)+f[l[i],k]+f[r[i],m-k](0km)(if l[i]<>0)

 

59   线性动态规划

-----多重历史

f[i,j]:=sigma{f[i-k,j-1]}(ifchecked)

 

60   背包问题

-----+-1背包问题+回溯
-----CEOI1998 Substract

f[i,j]:=f[i-1,j-a[i]]or f[i-1,j+a[i]]

 

61   线性动态规划(字符串)

-----古城之谜

f[i,1,1]:=min{f[i+length(s),2,1],f[i+length(s),1,1]+1}      f[i,1,2]:=min{f[i+length(s),1,2]+words[s],f[i+length(s),1,2]+words[s]}

 

62    线性动态规划

-----最少单词个数

f[i,j]:=max{f[I,j],f[u-1,j-1]+l}

 

63    树形动态规划

-----APIO2007 风铃

f[i]:=f[l]+f[r]+{1 (if checked)}

g[i]:=?

 

64    树形动态规划

-----APIO2007 风铃

f[i]:=f[l]+f[r]+{1 (if checked)}

g[i]:=?

 

65    地图动态规划

-----NOI 2005 adv19910

F[t,i,j]:=max{f[t-1,i-dx[d[[t]],j-dy[d[k]]]+1],f[t-1,i,j];

 

66    地图动态规划

-----优化的NOI 2005adv19910

F[k,i,j]:=max{f[k-1,i,p]+1}j-b[k]<=p<=j;

 

67    目标动态规划

-----CEOI98 subtra

F[I,j]:=f[I-1,j+a[i]] orf[i-1,j-a[i]]

 

68    目标动态规划

-----双塔问题

F[value,delta]:=g[value+a[i],delta+a[i]]or g[value,delta-a[i]]

 

69    树形动态规划

-----有线电视网

f[i,p]:=max(f[i,p],f[i,p-q]+f[j,q]-map[i,j])

     leaves[i]>=p>=l, 1<=q<=p;

 

70    地图动态规划

-----vijos某题

F[I,j]:=min(f[i-1,j-1],f[I,j-1],f[i-1,j]);

 

71    最大子矩阵问题

-----最大字段和问题

f[i]:=max(f[i-1]+b[i],b[i]);f[1]:=b[1]

 

72    最大子矩阵问题

-----最大子立方体问题

枚举一组边i的起始,压缩进矩阵 B[I,j]+=a[x,I,j]

枚举另外一组边的其实,做最大子矩阵

 

73    括号序列

-----线型动态规划

f[I,j]:=min(f[I,j],f[i+1,j-1](s[i]s[j]=”()”or(”[]”)),

f[I+1,j+1]+1 (s[j]=”(”or”[” ) ,f[I,j-1]+1(s[j]=”)”or”]” )

 

74    棋盘切割

-----线型动态规划

f[k,x1,y1,x2,y2]=min{min{f[k-1,x1,y1,a,y2]+s[a+1,y1,x2,y2],

f[k-1,a+1,y1,x2,y2]+s[x1,y1,a,y2]

min{}}

 

75    概率动态规划

-----聪聪和可可(NOI2005)

x:=p[p[i,j],j]

f[I,j]:=(f[x,b[j,k]]+f[x,j])/(l[j]+1)+1

f[I,i]=0

f[x,j]=1

 

76    概率动态规划

-----血缘关系

    我们正在研究妖怪家族的血缘关系。每个妖怪都有相同数量的基因,但是不同的妖怪的基因可能是不同的。我们希望知道任意给定的两个妖怪之间究竟有多少相同的基因。由于基因数量相当庞大,直接检测是行不通的。但是,我们知道妖怪家族的家谱,所以我们可以根据家谱来估算两个妖怪之间相同基因的数量。

    妖怪之间的基因继承关系相当简单:如果妖怪C是妖怪AB的孩子,则C的任意一个基因只能是继承AB的基因,继承AB的概率各占50%。所有基因可认为是相互独立的,每个基因的继承关系不受别的基因影响。

   现在,我们来定义两个妖怪XY的基因相似程度。例如,有一个家族,这个家族中有两个毫无关系(没有相同基因)的妖怪AB,及它们的孩子CD。那么CD相似程度是多少呢?因为CD的基因都来自AB,从概率来说,各占50%。所以,依概率计算CD平均有50%的相同基因,CD的基因相似程度为50%。需要注意的是,如果AB之间存在相同基因的话,CD的基因相似程度就不再是50%了。

    你的任务是写一个程序,对于给定的家谱以及成对出现的妖怪,计算它们之间的基因相似程度。

 

F[A, B]=(f[A0, B]+P[A1,B])/2

f[I,i]=1

f[I,j]=0(I,j无相同基因)

 

77    线性动态规划

-----决斗

F[I,j]=(f[I,j] and f[k,j]) and (e[I,k]or e[j,k]),i<k<j

 

78    线性动态规划

-----舞蹈家

F[x,y,k]=min(f[a[k],y,k+1]+w[x,a[k]],f[x,a[k],k+1]+w[y,a[k]])

 

79    线性动态规划

-----积木游戏

F[I,a,b,k]=max(f[I,a+1,b,k],f[i+1,a+1,a+1,k’],f[I,a+1,a+1,k’])

 

80    树形动态规划

-----NOI2003 逃学的小孩

                 F[i]:=max

 

81    树形动态规划

-----NOI2006 网络收费

                 F[i]:=max

 

82    贪心的动态规划

-----NOI2006 千年虫

                 F[i]:=max

 

83    树形动态规划

-----IOI2005 河流

                 F[i]:=max

 

84    树形动态规划

-----POI2004 山洞

                 F[i]:=max

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值