P2113 看球泡妹子
by luogu
https://www.luogu.com.cn/problem/P2113
一个dp题
dp[i][j][k]表示 前i个,选了t个,小红满意度j时 小明的最大满意度
#include<bits/stdc++.h> using namespace std; int n,m,k,c; int dp[111][111][2021]; int a[111],b[110]; int p[111],q[111]; int happy; int ans=-1; int maxx; int main() { ios::sync_with_stdio(false); memset(dp,128,sizeof(dp));//置为负数 cin>>n>>m>>maxx>>c; for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=1;i<=n;i++) { cin>>b[i]; } for(int i=1;i<=m;i++) { cin>>p[i]>>q[i]; happy+=(b[p[i]]+b[q[i]]);//最大是多少 } for(int i=0;i<=m;i++) dp[i][0][0]=0;//初始化,0场的话,快乐的指数和精彩度 for(int i=1;i<=m;i++)//前m场比赛 { for(int j=1;j<=i;j++)//肯定小于i { for(int k=0;k<=happy;k++)//考虑快乐指数 { dp[i][j][k]=dp[i-1][j][k]; //从上场比赛转移过来 if(k>=(b[p[i]]+b[q[i]])) {//快乐指数大于,那么可以考虑(指状态来源 dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-1][k-b[p[i]]-b[q[i]]]+a[p[i]]*a[q[i]]); //前i场 看了j场 快乐指数k ··上场,上场少看一场(k要减去之前快乐指数)+ 精彩度相 * } } } } for(int i=c;i<=happy;i++) ans=max(ans,dp[m][maxx][i]); //考虑 最后状态 快乐指数>c 的所有状态 cout<<ans; return 0; }