【HDOJ】4317 Unfair Nim

本文介绍了一种使用状态压缩动态规划解决特定类型问题的方法,并通过一个具体的实现案例详细展示了如何进行状态压缩,以及如何利用DP来求解问题。文章还提供了一个数据生成器用于测试和验证算法的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本的状态压缩,想明白怎么dp还是挺简单的。
显然对n个数字进行状态压缩,dp[i][j]表示第i位状态j表示的位向高位产生了进位。

  1 /* 4317 */
  2 #include <iostream>
  3 #include <sstream>
  4 #include <string>
  5 #include <map>
  6 #include <queue>
  7 #include <set>
  8 #include <stack>
  9 #include <vector>
 10 #include <deque>
 11 #include <algorithm>
 12 #include <cstdio>
 13 #include <cmath>
 14 #include <ctime>
 15 #include <cstring>
 16 #include <climits>
 17 #include <cctype>
 18 #include <cassert>
 19 #include <functional>
 20 #include <iterator>
 21 #include <iomanip>
 22 using namespace std;
 23 //#pragma comment(linker,"/STACK:102400000,1024000")
 24 
 25 #define sti                set<int>
 26 #define stpii            set<pair<int, int> >
 27 #define mpii            map<int,int>
 28 #define vi                vector<int>
 29 #define pii                pair<int,int>
 30 #define vpii            vector<pair<int,int> >
 31 #define rep(i, a, n)     for (int i=a;i<n;++i)
 32 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 33 #define clr                clear
 34 #define pb                 push_back
 35 #define mp                 make_pair
 36 #define fir                first
 37 #define sec                second
 38 #define all(x)             (x).begin(),(x).end()
 39 #define SZ(x)             ((int)(x).size())
 40 #define lson            l, mid, rt<<1
 41 #define rson            mid+1, r, rt<<1|1
 42 
 43 const int INF = 0x3f3f3f3f;
 44 int dp[23][(1<<10)+5];
 45 int Bit[23];
 46 int a[15];
 47 int C[(1<<10)+5];
 48 int n;
 49 
 50 int getBit(int x) {
 51     int ret = 0;
 52     
 53     while (x) {
 54         ret += (x & 1);
 55         x >>= 1;
 56     }
 57     
 58     return ret;
 59 }
 60 
 61 void Init() {
 62     int mst = 1<<10;
 63     rep(i, 0, mst)
 64         C[i] = getBit(i);
 65 }
 66 
 67 void solve() {
 68     rep(j, 0, 22) {
 69         Bit[j] = 0;
 70         rep(i, 0, n) {
 71             if (a[i] & (1<<j))
 72                 Bit[j] |= (1<<i);
 73         }
 74     }
 75     
 76     memset(dp, INF, sizeof(dp));
 77     dp[0][0] = 0;
 78     int mst = 1<<n;
 79     int mask = mst - 1;
 80     int ans, tmp;
 81     
 82     rep(i, 0, 22) {
 83         rep(j, 0, mst) {
 84             if (dp[i][j] == INF)
 85                 continue;
 86             
 87             int ov = j & Bit[i];
 88             int one = Bit[i] ^ j;
 89             int zero = mask & ~one;
 90             rep(k, 0, mst) {
 91                 if (ov & ~k)
 92                     continue;
 93                 
 94                 int other_ov = k & ~ov;
 95                 if (other_ov & zero)
 96                     continue;
 97                 
 98                 tmp = C[other_ov];
 99                 int val = one ^ other_ov;
100                 if (C[val] & 1) {
101                     if (val == mask)
102                         continue;
103                     ++tmp;
104                 }
105                 
106                 tmp <<= i;
107                 dp[i+1][k] = min(dp[i+1][k], tmp+dp[i][j]);
108             }
109         }
110     }
111             
112     ans = dp[22][0];
113     if (ans == INF)
114         puts("impossible");
115     else
116         printf("%d\n", ans);
117 }
118 
119 int main() {
120     ios::sync_with_stdio(false);
121     #ifndef ONLINE_JUDGE
122         freopen("data.in", "r", stdin);
123         freopen("data.out", "w", stdout);
124     #endif
125     
126     Init();
127     while (scanf("%d", &n)!=EOF) {
128         rep(i, 0, n)
129             scanf("%d", &a[i]);
130         solve();
131     }
132     
133     #ifndef ONLINE_JUDGE
134         printf("time = %d.\n", (int)clock());
135     #endif
136     
137     return 0;
138 }

数据发生器。

 1 from copy import deepcopy
 2 from random import randint, shuffle
 3 import shutil
 4 import string
 5 
 6 
 7 def GenDataIn():
 8     with open("data.in", "w") as fout:
 9         t = 20
10         bound = 10**6
11         # fout.write("%d\n" % (t))
12         for tt in xrange(t):    
13             n = randint(1, 10)
14             fout.write("%d\n" % (n))
15             dataList = []
16             for i in xrange(n):
17                 x = randint(1, bound)
18                 dataList.append(x)
19             fout.write(" ".join(map(str, dataList)) + "\n")
20             
21                 
22 def MovDataIn():
23     desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"
24     shutil.copyfile("data.in", desFileName)
25 
26     
27 if __name__ == "__main__":
28     GenDataIn()
29     MovDataIn()

 

转载于:https://www.cnblogs.com/bombe1013/p/5185778.html

内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值