From a7286a6ecad01259f0692bb4e0e5c0e91868f010 Mon Sep 17 00:00:00 2001 From: Kirito <1362050620@qq.com> Date: Tue, 23 Aug 2016 14:09:14 +0800 Subject: [PATCH] Create 1821_proverbs.cpp From http://www.cnblogs.com/proverbs/archive/2012/10/04/2711751.html --- POJ/1821_proverbs.cpp | 71 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 POJ/1821_proverbs.cpp diff --git a/POJ/1821_proverbs.cpp b/POJ/1821_proverbs.cpp new file mode 100644 index 0000000..08e7979 --- /dev/null +++ b/POJ/1821_proverbs.cpp @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include + +#define N 120 +#define M 17000 + +using namespace std; + +struct RE +{ + int l,p,s; +} re[N]; + +int q[M],l[N],r[N],dp[N][17000],n,k; + +inline bool cmp(const RE &a,const RE &b) +{ + return a.sh&&dp[i-1][q[t-1]]-q[t-1]*re[i].p<=tmp) t--; + q[t++]=j; + } + for(int j=re[i].s,tmp; j<=r[i]; j++) + { + while(t>h&&j-q[h]>re[i].l) h++;//弹出不在范围中的元素 + dp[i][j]=max(dp[i-1][j],dp[i][j-1]); + dp[i][j]=max(dp[i][j],dp[i-1][q[h]]+(j-q[h])*re[i].p); + } + for(int j=r[i]+1; j<=n; j++) dp[i][j]=max(dp[i-1][j],dp[i][j-1]); + } + int ans=0; + for(int i=1; i<=n; i++) ans=max(ans,dp[k][i]); + printf("%d\n",ans); +} + +int main() +{ + while(scanf("%d%d",&n,&k)!=EOF) + { + read(); + go(); + } + return 0; +}