pku 1185 炮兵阵地

本文详细介绍了一道经典的状态压缩动态规划题目。文章分析了如何通过二进制压缩减少状态数量,并利用三维数组解决信息传递的问题,给出了完整的代码实现。

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

很经典的一道状态压缩DP~

刚开始写这道题目的时候分析了下,很明显的二进制压缩,每行有1024中情况,但是每两个阵地之间至少要相隔2,最后一算只有60种形态。

感觉不是很麻烦就写了,写着发现不对劲,由于一行需要由前面两行的状态决定,而我开的是二维数组,怎么也不能完全的把信息转换过来。。

一直很纠结于怎样传递信息,最后很无奈的上网搜了下代码,发现用三维的数组就可以了。。

DP[i][j][k]表示第i行当前为第j种状态,i-1行为第k种状态,那么状态转移方程就很容易搞定了。。

DP[i][j][k]=max(DP[i][j][k],DP[i-1][k][h]),其中(st[j]&st[k])==0,(st[j]&st[h])==0,(st[k]&st[h])==0.

st[j]表示第j种状态。

贴下代码:(很龊的)

ContractedBlock.gifExpandedBlockStart.gifView Code
  1 # include<stdio.h>
2 # include<string.h>
3 int n,m;
4 int s[11]={1,2,4,8,16,32,64,128,256,512,1024};
5 char map[105][12];
6 int DP[102][65][65];
7 int st[65];
8 int judge(int i)//判断状态i是否符合要求
9 {
10 int end,cur,ans;
11 end=-3;
12 cur=-1;
13 while(i)
14 {
15 cur++;
16 ans=i%2;
17 if(ans==1)
18 {
19 if(cur-end<3)
20 return 0;
21 end=cur;
22 }
23 i/=2;
24 }
25 return 1;
26 }
27 int cmp(int i)//求i的二进制中有多少个1
28 {
29 int count=0;
30 while(i)
31 {
32 if(i%2) count++;
33 i/=2;
34 }
35 return count;
36 }
37 int max(int a,int b)
38 {
39 return a>b?a:b;
40 }
41 int main()
42 {
43 int i,j,k,h,i1,ans,temp;
44 k=0;
45 for(i=0;i<1024;i++)
46 {
47 if(judge(i)) st[k++]=i;
48 }
49 while(scanf("%d%d",&n,&m)!=EOF)
50 {
51 for(i=0;i<n;i++)
52 scanf("%s",map[i]);
53 memset(DP,0,sizeof(DP));
54 ans=0;
55 temp=0;
56 for(i=0;i<m;i++)
57 if(map[0][i]=='H') temp+=s[i];
58 for(i=0;i<k;i++)
59 {
60 if(st[i]>=s[m]) break;
61 /*for(j=0;j<m;j++)
62 if((st[i]&s[j]) && map[0][j]=='H') break;
63 if(j<m) continue;*/
64 if(st[i]&temp) continue;
65 for(j=0;j<k;j++)
66 {
67 if(st[j]>=s[m]) break;
68 DP[0][i][j]=cmp(st[i]);
69 }
70 ans=max(ans,DP[0][i][0]);
71 }
72 for(i=1;i<n;i++)
73 {
74 for(j=0;j<k;j++)
75 {
76 if(st[j]>=s[m]) break;
77 temp=0;
78 for(h=0;h<m;h++)
79 if((st[j]&s[h]) && map[i][h]=='H') break;
80 else if(st[j]&s[h]) temp++;
81 if(h<m) continue;
82 for(h=0;h<k;h++)
83 {
84 if(st[h]>=s[m]) break;
85 if(st[j]&st[h]) continue;
86 if(i==1) DP[1][j][h]=max(DP[1][j][h],DP[0][h][0]);
87 else
88 {
89 for(i1=0;i1<k;i1++)
90 {
91 if(st[i1]>=s[m]) break;
92 if(!(st[j]&st[i1]) && !(st[h]&st[i1])) DP[i][j][h]=max(DP[i][j][h],DP[i-1][h][i1]);
93 }
94 }
95 DP[i][j][h]+=temp;
96 ans=max(DP[i][j][h],ans);
97 }
98 }
99 }
100 printf("%d\n",ans);
101 }
102 return 0;
103 }

转载于:https://www.cnblogs.com/183zyz/archive/2011/07/30/2122143.html

内容概要:该论文探讨了一种基于粒子群优化(PSO)的STAR-RIS辅助NOMA无线通信网络优化方法。STAR-RIS作为一种新型可重构智能表面,能同时反射和传输信号,与传统仅能反射的RIS不同。结合NOMA技术,STAR-RIS可以提升覆盖范围、用户容量和频谱效率。针对STAR-RIS元素众多导致获取完整信道状态信息(CSI)开销大的问题,作者提出一种在不依赖完整CSI的情况下,联合优化功率分配、基站波束成形以及STAR-RIS的传输和反射波束成形向量的方法,以最大化总可实现速率并确保每个用户的最低速率要求。仿真结果显示,该方案优于STAR-RIS辅助的OMA系统。 适合人群:具备一定无线通信理论基础、对智能反射面技术和非正交多址接入技术感兴趣的科研人员和工程师。 使用场景及目标:①适用于希望深入了解STAR-RIS与NOMA结合的研究者;②为解决无线通信中频谱资源紧张、提高系统性能提供新的思路和技术手段;③帮助理解PSO算法在无线通信优化问题中的应用。 其他说明:文中提供了详细的Python代码实现,涵盖系统参数设置、信道建模、速率计算、目标函数定义、约束条件设定、主优化函数设计及结果可视化等环节,便于读者理解和复现实验结果。此外,文章还对比了PSO与其他优化算法(如DDPG)的区别,强调了PSO在不需要显式CSI估计方面的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值