POJ 1159 滚动数组优化内存

题意:

  输入一个n和长度为n的字符串,求最少需要增加多少个字符,使之成为一个回文(从左到右读和从右到左读是一样的)   (其实就是括号配对的变形)

 

知识点:

  滚动数组内存优化。就像dp[5005][5005] ,占用的内存太大 ,无法编译,利用滚动数组就能很好的解决这个问题,简单来说就是dp[3][5005]来代替dp[5005][5005] ,用dp[i%3][j],dp[(i-1)%3][j], dp[(i+1)%3][j]表示。(其实这一题还可以这样改:用short int dp[5005][5005])

具体可以看 http://blog.csdn.net/niushuai666/article/details/6677982,解释的比较详细

 

技术分享
 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 char str[5005];
 5 int dp[3][5005];
 6 int main()
 7 {
 8     int n;
 9     int i,j,k;
10     cin>>n;
11     cin>>str;
12     for(int l=2;l<=n;l++)
13     {
14         for(i=0;i<n-l+1;i++)
15         {
16             j = i+l-1;
17             if(str[i]!=str[j]) 
18                 dp[i%3][j] = min(dp[(i+1)%3][j]+1,dp[i%3][j-1]+1);
19             else dp[i%3][j] = dp[(i+1)%3][j-1];
20         }
21     }
22     cout<<dp[0][n-1]<<endl;
23     return 0;
24 } 
View Code

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。