两道dp——ucf 2017
Posted zsbenn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两道dp——ucf 2017相关的知识,希望对你有一定的参考价值。
G——直接把每种物品拆成一个个的,就可以用线性dp扫一次做完
/* 直接拆成一个一个的 dp[i][j]表示用j次机会把前i个拿下的概率 初始状态:dp[i][i]=dp[i-1][i-1]*p[i] dp[i][j]=dp[i-1][j-1]*p[i]+dp[i][j-1]*(1-p[i]) */ #include<bits/stdc++.h> using namespace std; int n,tot; double p[3000],dp[2][20000]; int main(){ int t;cin>>t; while(t--){ memset(dp,0,sizeof dp); tot=1; cin>>n; for(int i=1;i<=n;i++){ int k; double x; cin>>k>>x; for(int j=tot;j<=tot+k-1;j++) p[j]=x; tot+=k; } int a;cin>>a; tot--; for(int i=0;i<=a;i++) dp[0][i]=1; int cur=1; for(int i=1;i<=tot;i++){ for(int j=i;j<=a;j++){ dp[cur][j]=dp[cur^1][j-1]*p[i]; if(j!=i)dp[cur][j]+=dp[cur][j-1]*(1-p[i]); } cur^=1; //memset(dp[cur],0,sizeof dp[cur]); } if(tot>a)puts("0.000"); else printf("%.3lf\n",dp[cur^1][a]); } }
H——暴力lis
/* pre[i][j]表示以i为结尾长度为j的lis的最右端起点 dp[i]=max(j+dp[pre[i][j]-1],dp[i-1])
*/ #include<bits/stdc++.h> using namespace std; #define N 205 int n,a[N],dp[N],pre[N][N]; int main(){ int t;cin>>t; while(t--){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) pre[i][j]=0; for(int i=1;i<=n;i++) pre[i][1]=i; for(int i=1;i<=n;i++) for(int j=i-1;j>=1;j--) if(a[i]>a[j]){ pre[i][2]=j;break; } for(int k=3;k<=n;k++){//长为k的lis for(int i=1;i<=n;i++) for(int j=i-1;j>=1;j--) if(a[i]>a[j]){ pre[i][k]=max(pre[i][k],pre[j][k-1]); } } /* for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) cout<<pre[i][j]<<" "; puts(""); } puts("");*/ for(int k=1;k<=n;k++){ memset(dp,0,sizeof dp); for(int i=1;i<=n;i++){ dp[i]=dp[i-1]; for(int j=k;j<=n;j++) if(pre[i][j]!=0) dp[i]=max(dp[i],dp[pre[i][j]-1]+j); } if(k==n)cout<<dp[n]<<‘\n‘; else cout<<dp[n]<<" "; } } }
以上是关于两道dp——ucf 2017的主要内容,如果未能解决你的问题,请参考以下文章
UCF Local Programming Contest 2017(2020-04-06)
2020.04.06 UCF Local Programming Contest 2017