C - Almost Sorte

简介: C - Almost Sorte

atcoder.jp/contests/ar…

  • 很难想到的动态规划,优化空间的思路非常巧妙
  • 用相对位置来转移
  • f[i][j]表示i之前,放置数字的压缩情况为j,的所有方案数
  • ** f[i+1][(j | (1 << k)) >> 1] += f[i][j] **
  • k表示i放的数字的相对位置
  • 具体转移还是看代码

c

复制代码

#include<bits/stdc++.h>
#define debug1(a) cout<<#a<<'='<< a << endl;
#define debug2(a,b) cout<<#a<<" = "<<a<<"  "<<#b<<" = "<<b<<endl;
#define debug3(a,b,c) cout<<#a<<" = "<<a<<"  "<<#b<<" = "<<b<<"  "<<#c<<" = "<<c<<endl;
#define debug4(a,b,c,d) cout<<#a<<" = "<<a<<"  "<<#b<<" = "<<b<<"  "<<#c<<" = "<<c<<"  "<<#d<<" = "<<d<<endl;
#define debug5(a,b,c,d,e) cout<<#a<<" = "<<a<<"  "<<#b<<" = "<<b<<"  "<<#c<<" = "<<c<<"  "<<#d<<" = "<<d<<"  "<<#e<<" = "<<e<<endl;
#define debug0(x) cout << "debug0: " << x << endl
#define fr(t, i, n)for (long long i = t; i < n; i++)
#define YES cout<<"Yes"<<endl
#define nO cout<<"no"<<endl
#define fi first
#define se second
//#define int long long
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;
//#pragma GCC optimize(3,"Ofast","inline")
//#pragma GCC optimize(2)
const int N = 510,mod = 998244353;
int f[N][1<<15];                                //表示i之前的所有数字的使用情况,压缩为j
int a[N];                                       //通过相对位置来转移
                                                //因为像个的太远肯定彼此之间不会用到
void solve() 
{
    f[0][0] = 1;                    
    int n,d;cin >> n >> d;
    for(int i = 0;i < n;i ++)
    {
        cin >> a[i];
        a[i] --;
    }
    for(int i = 0;i < n;i ++)                   //位置
    {
        for(int j = 0;j < 1<<(2*d + 1);j ++)    //状态
        {
            if(a[i] >= 0)                       //a[i]大于0的情况
            {
                int temp = a[i] - i + d;        //已经放的数字对应的相对位置
                if(~j>>temp&1)(f[i+1][(j | (1<<temp)) >> 1] += f[i][j]) %= mod;
                continue;
            }
            for(int k = 0;k < 2*d+1;k ++)       //a[i]是-1的情况
            {
                int newi = k - d + i;
                if(newi < 0 || newi >= n)continue;
                if(j>>k&1)continue;             
                (f[i+1][(j|(1<<k)) >> 1] += f[i][j]) %= mod;
            }
        }
    }
    // for(int i = 0;i <= n;i ++)                   //位置
    // {
    //     debug2(i,f[i][(1<<d) - 1]);
    // }
    cout << f[n][((1<<d) - 1)] << endl;             //((1<<d) - 1)d个1的二进制,正好是n之前所有的
    
}
signed main()
{
    /*
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    */
    int T = 1;//cin >> T;
    while(T--){
        solve();
    }
    return 0;
}


相关文章
|
6月前
|
安全 数据安全/隐私保护
公钥私钥是什么,分别有什么用?
公钥私钥是什么,分别有什么用?
|
算法 数据可视化 安全
Docker-11:Docekr安装Etcd
Docker方式安装etcd
1431 0
Docker-11:Docekr安装Etcd
|
canal 存储 SQL
MySQL 与 Redis 缓存的同步方案
本文介绍MySQL与Redis缓存的同步的两种方案 方案1:通过MySQL自动同步刷新Redis,MySQL触发器+UDF函数实现 方案2:解析MySQL的binlog实现,将数据库中的数据同步到Redis 一、方案1(UDF)
MySQL 与 Redis 缓存的同步方案
|
6月前
|
网络协议 数据安全/隐私保护 网络架构
OSI七层模型和TCPIP五层模型
OSI七层模型和TCPIP五层模型
|
6月前
|
前端开发 Linux Shell
|
6月前
|
Shell 应用服务中间件 nginx
6.Docker Compose
6.Docker Compose
|
6月前
7.Docker 私有仓库
7.Docker 私有仓库
|
6月前
|
Shell Docker Ruby
3.Docker容器的数据卷
3.Docker容器的数据卷
|
6月前
|
存储 负载均衡 算法
1. Etcd 介绍
1. Etcd 介绍
|
6月前
|
网络协议 算法 网络性能优化
TCP 重传、滑动窗口、流量控制、拥塞控制
TCP 重传、滑动窗口、流量控制、拥塞控制