zoukankan      html  css  js  c++  java
  • HDU4632

     1 /*
     2 区间dp
     3 dp[i][j]表示这个区间组成的子串是回文串的个数*/
     4 #include<stdio.h>
     5 #include<string.h>
     6 const int maxn=1010;
     7 int mod=10007;
     8 int dp[maxn][maxn];
     9 void init(int len)
    10 {
    11     memset(dp, 0, sizeof(dp));
    12     for(int i = 0; i < len; ++i)
    13     {
    14         dp[i][i] = 1;//处理一个字符的情况
    15     }
    16 }
    17 int main()
    18 {
    19     int i,j,n,m,k;
    20     char s[maxn];
    21     int t,cas=0;
    22     scanf("%d",&t);
    23     while(t--)
    24     {
    25         scanf("%s",s);
    26         m=strlen(s);
    27         init(m);
    28         for(i=1;i<m;i++)
    29         {
    30             for(j=0;j<m&&j+i<m;j++)
    31             {
    32                 if(s[j]==s[i+j])
    33                 {
    34                     dp[j][i+j]=(dp[j+1][i+j]+dp[j][i+j-1]+1)%mod;
    35 
    36                 }
    37                 /*d[i, j] = d[i, j -1] + d[i + 1, j] - d[i + 1, j - 1] + 1 + d[i + 1, j - 1],
    38                       (1 + d[i + 1, j - 1])中间的那些和两头的能构成回文串,两头对回文贡献为1,
    39                       (d[i, j -1] + d[i + 1, j] - d[i + 1, j - 1] )这是两头不能构成回文的个数
    40                       所以这整个区间的就是这个表达式*/
    41                 else
    42                 {
    43                   dp[j][i+j]=(dp[j+1][i+j]+dp[j][i+j-1]-dp[j+1][i+j-1])%mod;
    44                 }
    45                 /*这时候的d[i][i + p] 存的是不能和两头构成回文串的*/
    46             }
    47         }
    48         printf("Case %d: %d
    ",++cas,(dp[0][m-1]%mod+mod)%mod);//dp[0][m-1]可能是负数
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    MySQL 子查询
    mysql3
    mysql2
    mysql
    C语言理论知识
    冒泡排序
    猜数字游戏
    WPF清爽酷炫的界面Mahapps.metro
    如何在.net4.0中使用.net4.5的async/await
    在C#中使用官方驱动操作MongoDB
  • 原文地址:https://www.cnblogs.com/okboy/p/3231299.html
Copyright © 2011-2022 走看看