`
Midnight0101
  • 浏览: 16753 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

POJ3280 简单DP

阅读更多
poj3280:http://poj.org/problem?id=3280
简单的多子问题多选择dp问题:
dp[i][j]表示字符下标为i到j的子字符串构成回文的最小消费,构成解的子问题有以下两种情况:
1、str[i]!=str[j],则最小费用为dp[i][j]=min{dp[i+1][j]+cost(str[i]),dp[i][j-1]+cost[str[j]]},其中cost(char),是取得增加和删除该字符的费用较小值;
2、str[i]==str[j],则最小费用为dp[i][j]=min{dp[i][j],dp[i+1][j-1]},保证此时dp[i][j]已经求出。

#include <iostream>
#include <fstream>
#define MAX_DP 2011

using namespace std;

char str[MAX_DP];
unsigned int dp[MAX_DP][MAX_DP];
int cost[26];

unsigned int min(unsigned int a,unsigned int b)
{
	if(a>=b)
		return b;
	else
		return a;
}

unsigned int dodp(unsigned int start,unsigned int end)
{
	if(start>=end)		
		return 0;
	if(dp[start][end])
		return dp[start][end];

	dp[start][end]=min(dodp(start+1,end)+cost[str[start]-'a'],dodp(start,end-1)+cost[str[end]-'a']);
	if(str[start]==str[end])
		dp[start][end]=min(dp[start][end],dodp(start+1,end-1));
	return dp[start][end];
}



int main()
{
	
	unsigned int m,n;

	memset(cost,0,sizeof(cost));
	memset(dp,0,sizeof(dp));

	cin>>n>>m;
    cin>>str;

	for(int i=0;i<n;i++)
	{
		char temp;
		unsigned int a,b;
		cin>>temp;
		cin>>a>>b;
		cost[temp-'a']=min(a,b);
	}

	cout<<dodp(0,m-1)<<endl;

	return 0;
}



1
3
分享到:
评论

相关推荐

    poj dp总结,动态规划分类

    ### poj dp总结:动态规划分类 #### 概述 动态规划(Dynamic Programming,简称DP)是一种在计算机科学和数学中广泛使用的算法策略,用于解决最优化问题。它通过将复杂问题分解为较简单的子问题来求解,并利用这些...

    POJ题目简单分类(ACM)

    【标题】"POJ题目简单分类(ACM)" 涉及的知识点: 【描述】中的"学习起来更系统,更清爽"暗示了本话题旨在为ACM竞赛初学者提供一个有条理的学习路径。 【标签】"POJ 分类"表明我们将探讨的是基于POJ(Problemset On...

    poj题目分类

    * 较为复杂的动态规划:例如 poj1191、poj1054、poj3280、poj2029、poj2948、poj1925、poj3034。 数学 1. 组合数学: * 加法原理和乘法原理。 * 排列组合。 * 递推关系:例如 poj3252、poj1850、poj1019、poj...

    POJ算法题目分类

    * 型如下表的简单 DP:型如下表的简单 DP 是指解决问题的简单 DP 算法,如 poj3267、poj1836、poj1260、poj2533。 * 计算几何学:计算几何学是指解决问题的计算几何学算法,如 poj2031、poj1039。 六、数学 数学...

    poj训练计划.doc

    - 简单DP:如`poj3267, poj1836`。 - **数学** - 组合数学:如`POJ3252, poj1850`。 - 数论:如`poj2635, poj3292`。 #### 第二阶段中级训练计划 #### 第3周至第4周(共85题) - **进阶算法** - C++标准模版...

    acm poj300题分层训练

    5. **动态规划**和**数学**:poj1837、poj1276是简单的动态规划问题,poj3267、poj1836等进一步强化了DP,poj3252、poj1850等则涉及组合数学,poj2635、poj3292等训练了数论知识。 **中级阶段**则更加强调复杂算法...

    POJ1321-Chess Problem

    【描述】描述简单,表明这是一道与棋盘相关的编程挑战,可能涉及到棋类游戏的规则或逻辑。由于没有给出详细的题目描述,我们可以从一般编程竞赛的角度来推测其可能的内容。通常这类问题会要求参赛者编写程序解决某个...

    强大的POJ分类——各类编程简单题及其算法分类

    2. **线性DP**:包括单变量和二维DP问题,如表格形式的DP,如POJ3267、1836、1260、2533、3176、1080、1159和3176。 ### 数学 1. **组合数学**:学习加法原理、乘法原理、排列组合以及递推关系,如POJ3252、1850、...

    史上最全poj题目分类(159页).pdf

    动态规划是解决优化问题的一个数学方法,其基本思想是将复杂的问题分解为更简单的子问题,通过递推的方式,逐步得到问题的最优解。动态规划是计算机科学、运筹学和经济学等领域中一个重要的算法框架。 接着,具体...

    poj题目分类...

    简单、模拟题是 POJ 上的基础题目,它们通常不需要复杂的算法设计和实现。以下是一些推荐的题目: * 1001 Exponentiation * 1002 487-3279 * 1003 Hangover * 1701 Dissatisfying Lift * 2301 Beat the Spread! * ...

    ACM poj 题目分类

    在POJ(Programming Online Judge)平台上,题目被标记为“简单题”,表明它们适合初学者或作为基础练习。 在提供的部分题目列表中,我们能看到一些常见的算法类别,如动态规划(DP)、图论、字符串处理、最短路径...

    ACM常用算法及其相应的练习题.docx

    * 类似表的简单 DP:poj3267, poj1836, poj1260, poj2533 * 最长公共子序列:poj3176, poj1080, poj1159 * 最优二分检索树问题 六、数学 * 组合数学: + 加法原理和乘法原理 + 排列组合 + 递推关系 - poj3252...

    ACM常用算法及其相应的练习题 (2).docx

    (2) 简单DP:poj3267, poj1836, poj1260, poj2533 (3) 其他DP问题: 六、中级算法 本部分涵盖了中级算法,包括C++的标准模版库的应用、较为复杂的模拟题的训练、差分约束系统的建立和求解、最小费用最大流、双连通...

    ACM 详解算法目录

    例如,POJ1837和POJ1276是背包问题的典型例题,而POJ3267和POJ1836则是简单DP的经典例题。 数学部分涵盖了组合数学、数论和计算方法三方面。例如,POJ3252和POJ1850是组合数学的代表题,而POJ2635和POJ3292则是数论...

    pojacm题目具体分类

    2. **动态规划 (DP)** - 动态规划是一种通过将复杂问题分解成简单的子问题,并存储子问题的解以避免重复计算的策略。例如,在解决背包问题时,我们可以使用动态规划来找出最优的物品组合。 3. **贪心算法** - 贪心...

    POJ题目分类-题库分类

    POJ(Problemset Online Judge)是一个在线编程竞赛平台,提供了大量的编程题目供参赛者练习和比赛。这个平台上的题目按照不同的主题和难度进行了分类,帮助参赛者有针对性地提高编程技能和算法理解。以下是一些主要...

    02.北大POJ题库使用指南.docx

    2. **动态规划(DP)与记忆化搜索**: 动态规划是解决具有重叠子问题和最优子结构特征的问题的有效方法,如背包问题、最长公共子序列等。记忆化搜索是动态规划的一种优化,用于避免重复计算。如1037、1125、1458等...

Global site tag (gtag.js) - Google Analytics