HDU4628+状态压缩DP

本文介绍了一种使用状态压缩动态规划(DP)的方法来解决去除回文串问题,通过状态转移方程和回文状态判断实现最小步数求解。
  1 /*
  2 状态压缩DP
  3 dp[ i ]:达到i状态的最小step。
  4 题意:每次可以去掉一个回文串,求最少几步能取完。
  5 */
  6 #include<stdio.h>
  7 #include<string.h>
  8 #include<stdlib.h>
  9 #include<algorithm>
 10 #include<iostream>
 11 #include<queue>
 12 #include<map>
 13 #include<math.h>
 14 using namespace std;
 15 typedef long long ll;
 16 //typedef __int64 int64;
 17 const int maxn = 18;
 18 const int inf = 0x3f3f3f3f;
 19 const double pi=acos(-1.0);
 20 const double eps = 1e-8;
 21 int dp[ 1<<maxn ];
 22 char s[ maxn ];
 23 int state[ 1<<maxn ];//回文的状态
 24 
 25 bool JudgeOneZero( int ss,int len ){
 26     int Index[ maxn ];
 27     int cc = 0;
 28     int IndexOfString = 0;
 29     while( IndexOfString<len ){
 30         if( ss%2==1 ){// 所有的 “1” 代表该位置上有字母,即这些组合是回文串
 31             Index[ cc++ ] = IndexOfString;
 32         }
 33         ss /= 2;
 34         IndexOfString++;
 35     }
 36     if( cc==1 ) return true;
 37     int L,R;
 38     L = 0;
 39     R = cc-1;
 40     while( L<=R ){
 41         if( s[Index[L]]!=s[Index[R]] ) return false;
 42         L++;
 43         R--;
 44     }
 45     return true;
 46 }//判断s是否是回文状态 
 47 
 48 int init_state( int len ){
 49     int cnt = 0;
 50     int N = 1<<len;
 51     state[ cnt++ ] = 0;
 52     for( int i=1;i<N;i++ ){
 53         if( JudgeOneZero( i,len )==true ){
 54             state[ cnt++ ] = i;
 55         }
 56     }
 57     return cnt;
 58 } //初始化回文的状态
 59 
 60 bool Judge( int cur,int nxt,int len ){//当前状态cur,前一状态nxt
 61     int Index[ maxn ];
 62     int cc = 0;
 63     int IndexOfString = 0;
 64     while( IndexOfString<len ){
 65         if( cur%2==1 ){
 66             if( nxt%2==0 ) return false;
 67         }//当前状态为1,前一状态必须为1
 68         if( nxt%2==0 ){
 69             if( cur%2==1 ) return false;
 70         }//前一状态是0,当前状态也必须是0
 71         if( cur%2==0&&nxt%2==1 ){
 72             Index[ cc++ ] = IndexOfString;
 73         }
 74         IndexOfString++; 
 75         cur /= 2;
 76         nxt /= 2;
 77     }
 78     if( cc==1 ) return true;
 79     int L,R;
 80     L = 0;
 81     R = cc-1;
 82     //printf("cc=%d\n",cc);
 83     while( L<=R ){
 84         if( s[Index[L]]!=s[Index[R]] ) return false;
 85         L++;
 86         R--;
 87     }
 88     return true;
 89 }
 90 
 91 int main(){
 92     int T;
 93     scanf("%d",&T);
 94     while( T-- ){
 95         scanf("%s",s);
 96         int n = strlen(s);
 97         int cnt = init_state( n );
 98         int N = (1<<n);
 99         for( int i=0;i<N;i++ )
100             dp[ i ] = inf;
101         dp[ N-1 ] = 0;
102         /*
103         for( int i=N-2;i>=0;i-- ){
104              for( int j=0;j<N;j++ ){
105                  if( i==j ) continue;
106                  if( Judge( i,j,n )==true ){
107                      //printf("i=%d, j=%d\n",i,j);
108                      dp[ i ] = min( dp[i],dp[j]+1 );
109                      //printf("dp[%d] = %d\n\n",i,dp[i]);
110                  }
111              }
112         }
113         */
114         for( int i=N-2;i>=0;i-- ){
115             for( int j=0;j<cnt;j++ ){
116                 if( 0==(i&state[j]) ){
117                     dp[ i ] = min( dp[i],dp[state[j]|i]+1 );
118                 }
119             }
120         }            
121         printf("%d\n",dp[0]);
122     }
123     return 0;
124 }
View Code

 

转载于:https://www.cnblogs.com/xxx0624/p/3252504.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值