Java语言七年之痒

我以前一直坚信:
语言不是问题,算法与数据结构才是关键!
所以,从我刷acm的题目开始,我一直用的是java,因为java我真的是太熟练了。不想浪费时间的语言语法的层面,只想专心算法和数据结构。但是看着程序的运行结果,我动摇了。七年了,我开始动摇了。很多题目,java写出来的,同样的算法,需要几百ms,而c++不到0ms。差距如此之大,我不得不也练练c++了。 其实c++之前也学过,基本语法儿也没问题,我不喜欢,使用c++太麻烦了。所以学了java之后,一直用的java。而且,找工作的时候,java好像不如c++那么受欢迎。鉴于上面的两个原因,我就在练习acm题目的时候,使用c++吧。一方面享受速度带来的数字方面的好处,一方面练习c++,为找工作打点儿基础。 今天用c++刷了一道动态规划的题目,最长公共子序列的,要记录子序列是什么。在上一篇博客中,我已经分析了,最长公共子序列问题的动态规划解法,今天这道题目,加上打印子序列就好。方法算法导论上有介绍。比较简单,直接上AC代码:  

#include 
#include 
using namespace std;

const int CHAR_LEN = 31;
const int WORD_SIZE = 101;

char a[WORD_SIZE][CHAR_LEN], b[WORD_SIZE][CHAR_LEN];
int dp[WORD_SIZE][WORD_SIZE];
int e[WORD_SIZE][WORD_SIZE];
int pIndex[WORD_SIZE];
int pIdx = 0;
void printLCS(int i, int j) {
	if (0 == i || 0 == j) return;
	if (0 == e[i][j]) {
		printLCS(i - 1, j - 1);
		pIndex[pIdx++] = i - 1;
	} else if (1 == e[i][j])
		printLCS(i - 1, j);
	else
		printLCS(i, j - 1);
}

int main() {
	while (cin >> a[0]) {
		int len1 = 1;
		while (cin >> a[len1] && strcmp(a[len1], "#"))
			++len1;
		int len2 = 0;
		while (cin >> b[len2] && strcmp(b[len2], "#"))
			++len2;
		memset(e, 0, sizeof(e));
		memset(pIndex, -1, sizeof(pIndex));
		pIdx = 0;
		for (int i = 0; i <= len1; ++i)
			dp[i][0] = 0;
		for (int i = 0; i <= len2 ; ++i)
			dp[0][i] = 0;
		for (int i = 1; i <= len1; ++i)
			for (int j = 1; j <= len2; ++j) {
				if (0 == strcmp(a[i - 1], b[j - 1])) {
					e[i][j] = 0;
					dp[i][j] = dp[i - 1][j - 1] + 1;
 				} else {
 					if (dp[i - 1][j] >= dp[i][j - 1]) {
 						e[i][j] = 1;
 						dp[i][j] = dp[i - 1][j];
 					} else {
 						e[i][j] = -1;
 						dp[i][j] = dp[i][j - 1];
 					}
				}
			}
		printLCS(len1, len2);
		for (int i = 0; i < dp[len1][len2] - 1; ++i)
			cout << a[pIndex[i]] << " ";
		cout << a[pIndex[dp[len1][len2] - 1]] << endl;
	}
	return 0;
}


在使用java的第七个年头儿,我再次开始c++编程。 【引用】
《算法导论》

转载于:https://www.cnblogs.com/sing1ee/archive/2012/01/31/2765000.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值