zoukankan      html  css  js  c++  java
  • poj 1159

    dp,LCS的应用

    //求出输入的字符串和他的回文串的LCS的长度l,用此字符串的长度n-l,即得结果
    //还有存储的问题,如果用f[maxn][maxn]存储的话会超内存,可通过滚动数组优化
    //因为求当前f[i][j]时可能会用到f[i-1][j-1],f[i-1][j],f[i][j-1],观察发现i,j
    //只用到当前的i,i-1,二者可用奇偶性区分,只需用一个f[i%2][j]就可表示,为什么
    //不能用f[i][j%2]表示,可通过判定求当前的f[i][j%2]时,f[i-1][j%2]并不是f[i-1][j]
    //所以这样做是错误的,但前者却可以通过类似的方法判是正确的,所以只需f[2][maxn]的空间
    //就可以了
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int maxn=5002;
    const int inf=1<<30;
    char s[maxn],p[maxn];
    int f[2][maxn];
    int main()
    {
    	int n;
    	while(cin>>n)
    	{
    		getchar();
    		int i,j;
    		char c;
    		for(i=1;i<=n;i++)
    		{
    			scanf("%c",&c);
    			s[i]=c;p[n+1-i]=c;
    		}
    		s[n+1]='\0';p[n+1]='\0';
    		memset(f,0,sizeof(f));
    		for(i=1;i<=n;i++)
    		{
    			for(j=1;j<=n;j++)
    			{
    				f[i%2][j]=inf;
    				if(s[i]==p[j])
    					f[i%2][j]=f[(i-1)%2][j-1]+1;
    				else
    					f[i%2][j]=f[(i-1)%2][j]>f[i%2][j-1]?f[(i-1)%2][j]:f[i%2][j-1];
    			}
    		}
    		cout<<n-f[n%2][n]<<endl;
    	}
    	return 0;
    }


  • 相关阅读:
    Linux network driver
    Linux dd
    Linux aclocal
    Ubuntu
    Makefile
    控制导出符号
    Apache
    Linux nm命令
    Git Submodule
    Linux sed
  • 原文地址:https://www.cnblogs.com/lj030/p/3002293.html
Copyright © 2011-2022 走看看