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;
}

 

posted @ 2021-07-11 21:31  Hehe_0  阅读(50)  评论(0)    收藏  举报