NOIP2006
2015-09-03 14:05
387 查看
传送门
https://vijos.org/p/1312https://vijos.org/p/1313
https://vijos.org/p/1314
https://vijos.org/p/1315
T1 能量项链
题解
环形DP,变成2*n的线性,a[i]..a[k],a[k+1]..a[j]
a[i]..a[k],合并后形成的新珠子的前后分别为a[i],a[k+1]
同理a[k+1]..a[j]的前后分别为a[k+1],a[j+1]
我们定义dp[i,j]为[i,j]段合并后的最大值
那么我们合并a[i]..a[k],a[k+1]..a[j]的结果为:
dp[i,k]+dp[k+1,j]+a[i]*a[k+1]*a[j+1]
我们得到转移方程:
dp[i,j]=max(dp[i,j],dp[i,k]+dp[k+1,j]+a[i]*a[k+1]*a[j+1])
注意转移方向
var dp:array[0..250,0..250]of longint; x:array[0..250]of longint; i,j,k:longint; n,ans:longint; function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end; begin readln(n); for i:=1 to n do begin read(x[i]); x[i+n]:=x[i]; end; fillchar(dp,sizeof(dp),0); for j:=2 to n do for i:=1 to 2*n do for k:=i to i+j-2 do dp[i,i+j-1]:=max(dp[i,i+j-1],dp[i,k]+dp[k+1,i+j-1]+x[i]*x[k+1]*x[i+j]); for i:=1 to n do ans:=max(ans,dp[i,i+n-1]); // writeln(dp[,n]); writeln(ans); end.
T2 金明的预算方案
题目大意
给定购买物品的w[i],v[i]和它依附于谁在最大花费m的范围内获得最大的w[i]*v[i]
w[i]都是10的倍数,某个物品的依附品个数不超过2个
题解
DP,从决策入手!从决策入手!从决策入手!对于一个非依附品的物品,最多有三种决策
1.单独取它自己dp[j]:=max(dp[j],dp[j-w[i]]+w[i]*v[i])
2.如果有一个附属品,取它自己和它的附属品dp[j]:=max(dp[j],dp[j-w[i]-w[附属1]]+w[i]*v[i]+w[附属1]*v[附属1])
3.如果有两个附属品,分别取它自己和两个中一个,方程同上,或同时取它们三个
var x:array[0..100]of longint; sum:array[0..100,0..2]of longint; v,w:array[0..100]of longint; dp:array[0..3200]of longint; i,j,k:longint; n,m:longint; a,b,c:longint; function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end; begin readln(m,n); for i:=1 to n do begin readln(v[i],w[i],x[i]); v[i]:=v[i] div 10; if x[i]<>0 then begin inc(sum[x[i],0]); sum[x[i],sum[x[i],0]]:=i; end; end; m:=m div 10; dp[0]:=0; for i:=1 to n do begin if x[i]<>0 then continue; for j:=m downto v[i] do begin dp[j]:=max(dp[j],dp[j-v[i]]+v[i]*w[i]); if (sum[i,0]>0)and(j-v[i]-v[sum[i,1]]>=0) then dp[j]:=max(dp[j],dp[j-v[i]-v[sum[i,1]]]+v[i]*w[i]+v[sum[i,1]]*w[sum[i,1]]); if sum[i,0]>1 then begin if j-v[i]-v[sum[i,2]]>=0 then dp[j]:=max(dp[j],dp[j-v[i]-v[sum[i,2]]]+v[i]*w[i]+v[sum[i,2]]*w[sum[i,2]]); if j-v[i]-v[sum[i,2]]-v[sum[i,1]]>=0 then dp[j]:=max(dp[j],dp[j-v[i]-v[sum[i,2]]-v[sum[i,1]]]+v[i]*w[i]+v[sum[i,2]]*w[sum[i,2]]+v[sum[i,1]]*w[sum[i,1]]); end; end; end; writeln(dp[m]*10); end.
相关文章推荐
- bzoj2429
- this class is not key value coding-compliant for the key progressVIew
- 可以将txt快速转换成pdf的方法分享
- Regionals 2014 >> Latin America >> 6823 - Counting substhreengs
- 前端路上的各种问题-javascript—4
- socket通信之七:Overlapped I/O 完成例程模型实现的客户/服务器模型
- 又拍网架构中的分库设计
- CodeIgniter笔记-去掉index.php
- leetCode #142 Linked List Cycle II
- MySQL导入sql文件及常用命令
- Django ajax
- 【Android基础】-基于Apache HttpClient封装的网络操作工具类
- 上台阶
- haproxy反向代理
- 在纪念中国人民抗日战争暨世界反法西斯战争胜利70周年大会上的讲话
- Linux进程查看与管理
- httpd反向代理
- 【算法设计与数据结构】二分法解决最大值最小化问题——入门篇
- Ubuntu安装完后设置root密码
- sql server 2012 报表开发(2) reporting service 中制作分组折叠式报表