「日常训练」Kefa and Dishes(Codeforces Round #321 Div. 2 D)

本文详细解析CodeForces580D题目的解题思路,利用状态压缩动态规划方法,定义dp[i][stat]为最大美味程度,通过记忆化搜索或递推解决,实现美味程度最大化。

题意与分析(CodeForces 580D)

一个人有\(n\)道菜,然后要点\(m\)道菜,每道菜有一个美味程度;然后给你了很多个关系,表示如果\(x\)刚好在\(y\)前面做的话,他的美味程度就会增加\(c\)。求最大的美味程度。
这种题目一看就是状压dp,\(n \le 15\)啊。定义\(dp[i][stat]\)等于最后一道菜为第i个菜,吃完第i道菜后的状态是stat(第i位为是否吃过,二进制位数的和是吃过菜的总数)的最大美味程度。那么\[dp[i][stat]=max\{dp[j][stat-(1<<(i-1))]+extra[j][i]+taste[i]\}\]其中i、j必须在stat中有。然后记忆化搜索或者递推去解都可以。可以说是状压dp的板子题了。注意一下边界条件和起始求值即可。

代码

#include <bits/stdc++.h>
#define MP make_pair
#define PB emplace_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (repType i = (a); i <= (b); ++i)
#define per(i, a, b) for (repType i = (a); i >= (b); --i)
#define MS(x,y) memset(x,y,sizeof(x)) 
#define QUICKIO                  \
    ios::sync_with_stdio(false); \
    cin.tie(0);                  \
    cout.tie(0);
using namespace std;
using ll=long long;
using repType=ll;

ll dp[25][1000005];
ll taste[25];
ll extra[25][25];
int n,m,k;
ll solve(int last, int stat) // stat after eating up last
{
    //cout<<last<<" "<<stat<<endl;
    if(dp[last][stat]!=-1) return dp[last][stat];
    else
    {
        ll ans=0;
        int val=(stat-(1<<(last-1)));
        rep(i,1,n)
        {
            if(val&(1<<(i-1)))
            {
                ans=max(ans,solve(i,val)+extra[i][last]+taste[last]);
            }
        }
        //cout<<"    "<<last<<": "<<stat<<" "<<ans<<endl;
        return dp[last][stat]=ans;
    }
}
int main()
{
    MS(dp,-1);
    cin>>n>>m>>k;
    rep(i,1,n)
    {
        cin>>taste[i];
        dp[i][1<<(i-1)]=taste[i];
    }
    /*
    rep(i,1,n)
    {
        rep(j,0,((1<<n)-1))
            cout<<dp[i][j]<<" ";
        cout<<endl;
    }
    */
    rep(i,1,k)
    {
        int x,y,c;
        cin>>x>>y>>c;
        extra[x][y]=c;
    }
    ll ans=0;
    rep(i,1,n) dp[i][(1<<n)-1]=solve(i,(1<<n)-1);
    rep(i,1,n)
    {
        rep(j,0,((1<<n)-1))
        {
            if(__builtin_popcount(j)==m)
            {
                ans=max(ans,dp[i][j]);
            }
            //cout<<dp[i][j]<<" ";
        }
        //cout<<endl;
    }
    cout<<ans<<endl;
}

转载于:https://www.cnblogs.com/samhx/p/CFR321D2D.html

我现在要使用stata进行实证分析,实证模型如下gtfp1it=α+βkefa+γXit+μi+λt*ρp+ϵi,gtfp1为被解释变量,kefa为核心解释变量,政策冲击年份policy_year分别为2011年和2017年,代表第t年县级行政区i是否被纳入重点生态功能区,x为控制变量集,ϵ为随机干扰项;i表示市级行政区,t表示时间,p表示省级行政区,为提高因果推断的可靠性,本文控制了市级行政区固定效应id和省份—年份联合固定效应provinceid#year,将标准误聚类至市级行政区—年份层面,id_year,控制变量包括,1. 经济发展水平ed 2.产业结构is 3.创新能力creat 4.环境规制强度er 5.政府干预程度gover地6.财政压力pre 7.植被覆盖率plant 8.二氧化碳排放量co2,9,y ,现在我需要构建多时点双重差分模型,要求1.进行描述性统计并输出表格,2进行基准回归并输出表格,表格需要标注是否控制个体固定效应id和省份—年份联合固定效应provinceid#year 3进行创新cr中介机制分析并输出表格,进行环境规制er机制分析并输出表格 4,以2011和2017作为政策冲击时点进行多期did平行趋势检验,要求在进行均值计算后再进行平行趋势检验并输出表格 5,进行地区zone异质性分析,地区包括东中西,输出表格 6,进行安慰剂检验,要求根据kefa相关系数0.76输出结果图, 请确保所有命令完全契合我的模型和我的需求,要求命令必须真实可执行,需要调整的地方请做标注
最新发布
04-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值