• 紫书 例题 9-7 UVa 11584 (线性结构上的动态规划)


    这道题判断回文串的方法非常的秀!
    这里用到了记忆化搜索,因为会有很多重复
    同时用kase来区分每一组数据
    然后还有用递归来判断回文,很简洁

    然后这种线性结构的动态规划的题,就是把
    当前的这个数组分成两块来枚举,一块是之前已经得出的最优解,
    一块是自己现在按照题目要求来算出的值,这样枚举下去。
    然后要注意初始化的问题,同时注意这有后面自己算的这一块占
    了全部的情况,可以以此为初始的值。
    一定要给初始的值,不然答案可能全是0

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define REP(i, a, b) for(int i = (a); i < (b); i++)
    using namespace std;
    
    const int MAXN = 1123;
    int vis[MAXN][MAXN], d[MAXN], p[MAXN][MAXN], kase;
    char s[MAXN];
    
    bool judge(int i, int j)
    {
    	if(i >= j) return true;
    	if(s[i] != s[j]) return false;
    	if(vis[i][j] == kase) return p[i][j];
    	vis[i][j] = kase;
    	return p[i][j] = judge(i + 1, j - 1);
    }
    
    int main()
    {
    	int T;
    	scanf("%d", &T);
    	
    	for(kase = 1; kase <= T; kase++)
    	{
    		scanf("%s", s + 1);
    		int n = strlen(s + 1);
    		d[0] = 0;
    		REP(i, 1, n + 1)
    		{
    			d[i] = i;
    			REP(j, 0, i)
    				if(judge(j + 1, i))
    					d[i] = min(d[i], d[j] + 1);
    		}
    		printf("%d
    ", d[n]);
    	}
    	
    	return 0;
    }
  • 相关阅读:
    POJ 1001 Exponentiation
    POJ 2105 IP Address
    条款1:视C++为一个语言联邦
    条款2:尽量使用const ,enum,inline替换define
    走台阶问题
    Oracle之分页问题
    Oracle之子查询:Top-N问题
    Facade——外观模式
    PROXY——代理模式
    C++ 内联函数
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819454.html
Copyright © 2020-2023  润新知