CodeForces 580D (状压DP) Kefa and Dishes

点击打开链接

题意:有n盘菜,从里面选m盘可以品尝,每盘菜有一个满意值,另外有k种关系,先吃某盘菜后吃某盘的话可以增加ai满意度。

思路:约束条件有当前吃的哪盘菜,在吃这盘菜之前吃了哪几盘菜,所以定义状态是dp[i][j],表示当前让第i盘菜作为吃的最后一盘时,已经吃了菜的集合为j,获得的最大满意度;

用n位2进制表示状态,1表示吃过了这盘菜,0表示没吃,状态转移方程:dp[i][j]=max(dp[i][j],dp[k][q]+w[k][i]+a[i]),k为上一盘菜,q为上一状态;


#include
using namespace std;
typedef long long ll;
ll dp[20][1<<20];
ll val[20],w[20][20];
int main()
{
    ll n,m,k;
    while(~scanf("%lld%lld%lld",&n,&m,&k))
    {
         for(int i=0;i


你可能感兴趣的:(动态规划)