HDU 3811 炮兵阵地

题意:

中文题

http://poj.org/problem?id=1185

算法:

N <= 100;M <= 10。

枚举每行状态,1表示该行放炮兵,0表示不放,相邻两位不能有1,这样的状态才合法

特殊处理第一行,第二行状态。

int cow[110];//保存行状态信息
int num[100]; //保存状态数
int sum[100]; //保存状态对应的1,即炮兵数
int dp[110][64][64]; //dp方程, dp[i][j][k]表示第i行状态为j,上一行状态为k

枚举后面的行。由前往后推,num[i]&num[j] == 0 num[i]&num[k] == 0 num[j]&num[k] == 0

View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cow[110];//保存行状态信息 
int num[100]; //保存状态数
int sum[100]; //保存状态对应的1,即炮兵数
int dp[110][64][64]; //dp方程, dp[i][j][k]表示第i行状态为j,上一行状态为k
int N, M, len; //N行M列 
//预处理,求出所有状态 
void pre( )
{
  len = 1;
  for( int i = 0; i < (1<<M); i++)
  {
     int ans = i;
     if( (i&(ans<<1)) || (i&(ans<<2))) //使其合法 
       continue;
      num[len] = i;
      sum[len] = ans&1;
      while( ans )
      {
         ans >>= 1;
         sum[len] += ans&1;       
      } 
      len++; 
  }        
}

//判断状态是否合法,即状态为1的地方,在地图上应该为平原,如果状态为1的地方,地图上为山地则返回false
bool jugde( int state, int mp)
{
  for( int i = 1; i < ( 1 << M); i = i << 1)
  {
     if( (state & i) && ((mp & i) == 0) )
        return false;      
  }    
  return true;   
}

 
int main( )
{
  char str[110][20];
  while( scanf("%d%d", &N, &M) != EOF)
  { 
     pre( );
     for( int i = 1; i <= N; i++)
         scanf("%s",&str[i]);
     memset(cow, 0,sizeof(cow));
     for( int i = 1; i <= N; i++)
     {
          for( int j = 0; j < M; j++)
          {
             if( str[i][j] == 'P' )
                 cow[i] += (1<<j);
          }  
     }
     memset(dp, 0, sizeof(dp));
     //处理第一行 
     for( int i = 1; i < len; i++)
     {
        if( jugde(num[i], cow[1]) )
        {
           for( int j = 1; j < len; j++)
                dp[1][i][j] = sum[i];
        }     
          
     }
     //处理第二行
     for( int i = 1; i < len; i++)
     {  
       if( jugde(num[i], cow[2]) )
       {
        for( int j = 1; j < len; j++)
        {   
               for( int k = 1; k < len; k++)
               {
                  if( ( (num[i]&num[j]) == 0 ) && dp[1][j][k] + sum[i] > dp[2][i][j] )
                      dp[2][i][j] = dp[1][j][k] + sum[i];
                    
               }      
        }
       }          
     }
     //对其后面的若干行,状态转移
     for( int n = 3; n <= N; n++)
     for( int i = 1; i < len; i++)
       for( int j = 1; j < len; j++)
       {
         if( jugde(num[i],cow[n]) )
         {
           for( int k = 1;k < len; k++)
           {
                if( ((num[i]&num[j]) == 0 ) && ((num[j]&num[k]) == 0 ) && ((num[i]&num[k]) == 0 ))
                {
                    
                    if( dp[n][i][j] < dp[n-1][j][k] + sum[i] )
                        dp[n][i][j] = dp[n-1][j][k] + sum[i];     
                }       
           }
         }
       }
     int ans = 0;
     for( int i = 1; i < len; i++)
        for( int j = 1; j < len; j++)       
           if( dp[N][i][j] > ans)
             ans = dp[N][i][j];
     printf("%d\n",ans);
  }
  return 0;    
}

总结下状态压缩算法:

0.判断该题是否可以用状态压缩,

1.选择表示表示状态方法,含义,2进制,3进制,。。。。。定义DP方程,含义

2。根据题意,预处理合法状态

3.特殊处理边界条件

4.从前往后推,枚举所有状态,满足相应题目要求

5.数据量大的要用矩阵优化,记忆化搜索

6.输出最优解

 

转载于:https://www.cnblogs.com/tangcong/archive/2012/08/06/2625371.html

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值