摘要:
题意:给出N(N<=40)根木棍,每根长度为Li(Li<=40),要用完所有的木棍构成面积最大的三角形,求最大面积.分析:用can[i,j,k]表示用前i根木棍,组成两条长为j,k的长木棍是否可能.can[i,j,k]=can[i,j,k] or can[i-1,j-l[i],k] or can[i-1,j,k-l[i]] or can[i-1,j,k].最后枚举两条边,求出第三条边,用海伦公式求出面积即可.这是比较水的算法,跑了844MS..code:var can:array[0..40,0..800,0..800] of boolean; l:array[0..41] of 阅读全文
摘要:
题意:给出一棵树,问最少切断几条边可以得到有p个结点的子树.分析:明显的树形DP.f[i,j]表示以第i个节点为根的子树保留j个节点最少需要去掉几条边.f[i,j]=min{f[i,j-k]+f[s,k]-2} (s是i的儿子)ans=min{f[i,p]}code:type edge=record v,n:longint;end;const root=1; oo=10000;var e:array[0..400] of edge; vis:array[0..200] of boolean; h,s:array[0..200] of longint; t,f:array[0..200,0..2 阅读全文
摘要:
题意:有n个任务,第i个任务需要时间ti来完成,并且第i个任务必须在它前面的某些任务完成之后才能开始.给你任务信息,问你最短需要多少时间来完成任务.分析:题目给出的数据已经拓扑有序了,直接DP.f[i]表示第i个任务完成的最短时间,f[i]=max{f[j]}+ti (j必须在i之前完成)ans=max{f[i]}.code:var f:array[0..10001] of longint; n,i,j,k,t,p,ans,tmp:longint;begin readln(n); for i:=1 to n do begin read(t); read(k); tmp:=0; for j:=1 阅读全文