zoukankan      html  css  js  c++  java
  • 回文子序列数 编程之美 hihocoder 资格赛 第二题 2015年

     (ps:该的代码在30行的时候,会出现负数。也就是有问题。优化见下方)
    O(n^3)
    可以进一步优化为O(n^2)->通过优化cal函数
     
     
     1 #include <iostream>
     2 #include <string>
     3 #include <stdio.h>
     4 #include <memory>
     5 #include <string.h>
     6 using namespace std;
     7 long long map[1001][1001];
     8 string input;
     9 void cal(int start ,int end)
    10 {
    11     if(start==end)
    12     {
    13         map[start][end]=1;
    14         return ;
    15     }
    16     if(end-start==1)
    17     {
    18         if(input[start]==input[end])
    19             map[start][end]=3;
    20         else
    21             map[start][end]=2;
    22         return ;
    23     }
    24     map[start][end]+=map[start][end-1]+1;
    25     for(int i=end-1;i>=start;i--)
    26     {
    27         if(input[i]==input[end])
    28             map[start][end]+=map[i+1][end-1]+1;
    29     }
    30     map[start][end]%=100007;
    31 }
    32 int main()
    33 {
    34     int T;
    35     int Case=0;
    36     cin>>T;
    37     
    38     while(T--)
    39     {
    40         Case++;
    41         memset(map,0,sizeof(map));
    42         
    43         cin>>input;
    44         for(int i=0;i<input.size();i++)
    45         {
    46             for(int j=i;j>=0;j--)
    47             {
    48                 cal(j,i);
    49             }
    50         }
    51         cout<<"Case #"<<Case<<": "<<map[0][input.size()-1]<<endl;
    52     }
    53 
    54 }
     

    潇湘缘说的很对,以上代码是O(n^3)的,在面对最大数据1000的时候基本就是超时了的:

    以下是更正代码:优化了cal()函数,把map[start+1][end]充分利用起来,是O(n^2)的时间开销了

    (ps:为什么耗时还是19ms。。)

    (ps:之前的代码因为少了37行的过程,输出会有负数,也就是有问题。)

    以下代码已通过大数据测试

     1 #include <iostream>
     2 #include <string>
     3 #include <stdio.h>
     4 #include <memory>
     5 #include <string.h>
     6 using namespace std;
     7 long long map[1001][1001];
     8 string input;
     9 
    10 
    11 
    12 int main()
    13 {
    14     int T;
    15     int Case=0;
    16     cin>>T;
    17 
    18     while(T--)
    19     {
    20         Case++;
    21         memset(map,0,sizeof(map));
    22         cin>>input;
    23         for(int i=0;i<input.size();i++)
    24         {
    25             for(int j=i;j>=0;j--)
    26             {
    27                 if(j==i)
    28                 {
    29                     map[j][i]=1;
    30                     continue;
    31                 }
    32                 map[j][i]=map[j+1][i]-map[j+1][i-1]+map[j][i-1];
    33                 if(input[j]==input[i])
    34                 {
    35                     map[j][i]+= map[j+1][i-1]+1;
    36                 }
    37                 map[j][i]=(map[j][i]+100007)%100007;
    38             }
    39         }
    40         cout<<"Case #"<<Case<<": "<<map[0][input.size()-1]<<endl;
    41     }
    42 
    43 }
  • 相关阅读:
    计算机知识
    试题:论需求分析方法及应用
    试题:论信息系统开发方法及应用
    爬虫数据存储——安装docker和ElasticSearch(基于Centos7)
    go并发版爬虫
    go单任务版爬虫
    可变类型与不可变类型
    基本数据类型内置方法
    @submit.native.prevent作用
    获取当月第一天,今天的日期的方法
  • 原文地址:https://www.cnblogs.com/tjsudys/p/4434900.html
Copyright © 2011-2022 走看看