zoukankan      html  css  js  c++  java
  • HDU 4632 Palindrome subsequence(DP)

    题目链接

    做的我很无奈,当时思路很乱,慌乱之中,起了一个想法,可以做,但是需要优化。尼玛,思路跑偏了,自己挖个坑,封榜之后,才从坑里出来,过的队那么多,开始的时候过的那么快,应该就不是用这种扯淡方法做的。

      1 表示很无奈,没有想到简单的递推式,搞了一个MLE+TLE的方法。
      2 最初版本,多了一个for的复杂度,只要标记一下就好,可是在递归了不好处理,让我折腾了老一会,才弄好。
      3 复制代码
      4 int dfs(int l,int r)
      5 {
      6     int i,ans = 0;
      7     if(l == r)
      8         return 1;
      9     else if(l > r)
     10         return 0;
     11     if(dp[l][r])
     12         return dp[l][r];
     13     ans = dfs(l+1,r)+1;
     14     for(i = l+1; i <= r; i ++)
     15     {
     16         if(str[l] == str[i])
     17             ans = (ans + dfs(l+1,i-1) + 1)%MOD;
     18     }
     19     dp[l][r] = ans;
     20     return ans;
     21 }
     22 
     23 终于在3点多,改成了递推版本。然后MLE了。
     24 复制代码
     25 for(i = 0; i < len; i ++)
     26 {
     27     dp[i][i] = 1;
     28     sum[i][i][str[i]-'a'] = 1;
     29 }
     30 for(i = 1; i < len; i ++)
     31 {
     32     for(j = 0; j < len-i; j ++)
     33     {
     34         dp[j][i+j] = (dp[j+1][i+j] + 1 + sum[j+1][i+j][str[j]-'a'])%MOD;
     35     }
     36     for(j = 0; j < len; j ++)
     37     {
     38         if(j == 0) continue;
     39         k = str[j-1]-'a';
     40         if(i+j-1 == len) break;
     41         if(str[i+j] == str[j-1])
     42             sum[j][i+j][k] = (sum[j][i+j-1][k] + dp[j][i+j-1] + 1)%MOD;
     43         else
     44             sum[j][i+j][k] = sum[j][i+j-1][k];
     45     }
     46 }
     47 printf("Case %d: %d
    ",cas++,dp[0][len-1]);
     48 
     49 终于又改了改,A了。改的,我都看不懂这是什么意思了。
     50 #include <cstdio>
     51 #include <cstring>
     52 #include <ctime>
     53 #include <cstdlib>
     54 #include <string>
     55 #include <queue>
     56 #include <map>
     57 #include <algorithm>
     58 using namespace std;
     59 #define MOD 10007
     60 char str[1010];
     61 int dp[1010][1010],sum[1010][1010][26];
     62 int sum1[1010][26];
     63 int sum2[1010][26];
     64 int main()
     65 {
     66     int len,t,cas = 1,i,j,k;
     67     scanf("%d",&t);
     68     while(t --)
     69     {
     70         scanf("%s",str);
     71         len = strlen(str);
     72         for(i = 0; i < len; i ++)
     73         {
     74             for(j = 0; j < len; j ++)
     75                 dp[i][j] = 0;
     76         }
     77         for(i = 0; i < len; i ++)
     78         {
     79             for(j = 0; j < 26; j ++)
     80                 sum1[i][j] = sum2[i][j] = 0;
     81         }
     82         for(i = 0; i < len; i ++)
     83         {
     84             dp[i][i] = 1;
     85             sum1[i][str[i]-'a'] = 1;
     86         }
     87         for(i = 1; i < len; i ++)
     88         {
     89             if(i%2 == 1)
     90             {
     91                 for(j = 0; j < len-i; j ++)
     92                 {
     93                     dp[j][i+j] = (dp[j+1][i+j] + 1 + sum1[j+1][str[j]-'a'])%MOD;
     94                 }
     95                 for(j = 0; j < len; j ++)
     96                 {
     97                     if(j == 0) continue;
     98                     k = str[j-1]-'a';
     99                     if(i+j-1 == len) break;
    100                     if(str[i+j] == str[j-1])
    101                         sum2[j][k] = (sum1[j][k] + dp[j][i+j-1] + 1)%MOD;
    102                     else
    103                         sum2[j][k] = sum1[j][k];
    104                 }
    105             }
    106             else
    107             {
    108                 for(j = 0; j < len-i; j ++)
    109                 {
    110                     dp[j][i+j] = (dp[j+1][i+j] + 1 + sum2[j+1][str[j]-'a'])%MOD;
    111                 }
    112                 for(j = 0; j < len; j ++)
    113                 {
    114                     if(j == 0) continue;
    115                     k = str[j-1]-'a';
    116                     if(i+j-1 == len) break;
    117                     if(str[i+j] == str[j-1])
    118                         sum1[j][k] = (sum2[j][k] + dp[j][i+j-1] + 1)%MOD;
    119                     else
    120                         sum1[j][k] = sum2[j][k];
    121                 }
    122             }
    123         }
    124         printf("Case %d: %d
    ",cas++,dp[0][len-1]);
    125     }
    126     return 0;
    127 }
  • 相关阅读:
    关于抑或
    【vue】条件渲染 v-if v-else
    【vue】vue的目录结构、项目流程、vue-router
    【vue】在vue中引入iview
    【vue】vue如何创建一个项目
    【jquery】jquery怎么实现点击一个按钮控制一个div的显示和隐藏
    【angularjs】ng-model controller中取不到值(input)
    打印机增强软件pdfpro
    vagrant 安装ubuntu12.04 64 bit
    debian 7 stable 不能编译android源码
  • 原文地址:https://www.cnblogs.com/naix-x/p/3232194.html
Copyright © 2011-2022 走看看