P3694 邦邦的大合唱站队(状压dp

#include 
using namespace std;
using VI = vector;
using ll = long long;
int t;
int n,m;
int dp[1<<20];
int sum[21];
int s[200010][21];
int a[200010];
vector> q(200010);
int main(){
    cin>>n>>m;
    q[0].fill(0);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        a[i]--;
        sum[a[i]] ++;
        q[i] = q[i-1];
        q[i][a[i]] ++;
    }
  /*  for(int i=1;i<=n;i++){
        for(int j=0;j

是一道很好的状压题目

dp[x]  表示将x的队伍排好的最小移动 ,于是可以枚举末尾的队伍是哪个

因为排好的队伍长为 【1,s】 s表示状态x下的总人数,

枚举末尾的数字是 j  , 共sum[j] ,那么从【1,s-sum[j]】 就为已经排号的队伍,

从【s-sum[j]+1 , s】  为需要排的队伍,在这个区间的j可以不进行移动,

通过前缀处理前i个人 , 队伍j的人数 

你可能感兴趣的:(dp,算法,动态规划,c++)