题解 | #mixup2混乱的奶牛#

mixup2混乱的奶牛

https://ac.nowcoder.com/acm/problem/210981

本题算是状压dp的一个变形用法,在这里面将二进制位上的数从0变到1其实做得将牛放到末尾的操作,那么可以看到对于某一头牛他只关心前面一头牛是什么,前面牛到底有几种摆放方式和当前的牛无关。这符合动态规划的特性。
那么很容易得到状态转移方程为:dp[state|(1<<(i-1))][i] = dp[state|(1<<(i-1))][i]+dp[state][j]
值为方式数,放置的时候判断牛牛是否符合混乱即可。
//dp[state|(1<<(i-1))][i] = dp[state|(1<<(i-1))][i]+dp[state][j]
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 17;
int dp[1<<16][maxn];
int num[maxn];
int n, k;


signed main()
{
    cin>>n>>k;
    for (int i=1;i<=n;i++)
    {
        cin>>num[i];
    }
    for (int i=0;i<n;i++)
    {
        dp[1<<i][i+1] = 1;
    }
    int len = (1<<n)-1;
    for (int state=1;state<len;state++)
    {
        //遍历起点,一定是已经排过的牛
        for (int i=1;i<=n;i++)
        {
            if (((state>>(i-1))&1)==0) continue;
            for (int j=1;j<=n;j++)
            {
                if ((state>>(j-1))&1) continue;
                if (abs(num[i]-num[j])<=k) continue;
                dp[state|(1<<(j-1))][j] = dp[state|(1<<(j-1))][j]+dp[state][i];
            }
        }
    }
    int ans = 0;
    for (int j=1;j<=n;j++)
    {
        ans += dp[len][j];
    }
    cout<<ans;
    return 0;
}


全部评论
太感动了,没踢都竜砍到尼德体节。up祝共得五辆。
点赞 回复 分享
发布于 2024-10-11 19:34 山东

相关推荐

zygg:拼多多挂是不是过一两天就挂的呀
点赞 评论 收藏
分享
03-11 21:46
西北大学 Java
河和静子:这只是实习工资,我学长北大通班博一的,他同学被这家天天发邮件让他去实习,一个月10w
点赞 评论 收藏
分享
04-28 19:31
门头沟学院 Java
真烦好烦真烦:可恶的二手车贩子,居然对我们门头沟学院的人这么没礼貌
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务