1.题目:Given a string s, partition s such that every substring of the partition is a palindrome.Return the minimum cuts needed for a palindrome partitioning of s.
class Solution {
public:
int minCut(string s)
{
//得到字符串长度为N
const int N = s.size();
if(N<=1) return 0;
int i,j;
//用一个二维bool数组isPalin表示是否子串s[i..j]是回文串
bool isPalin[N][N];
//algorithm中的fill_n函数:从当前起点开始,将之后N*N个元素赋值为FALSE
fill_n(&isPalin[0][0], N*N, false);
//数组元素minCuts[i]保存子串s[0..i-1]的最小分割次数,minCuts[i]初始值为i-1(最大的分割次数),minCuts[0]初始值设为-1, which is needed in the case that s[0..i-1] is a palindrome.
int minCuts[N+1];
for(i=0; i<=N; ++i)
minCuts[i] = i-1;
for(j=1; j<N; ++j)
{
for(i=j; i>=0; --i)
{
//如果子串s[i..j]是回文串,则数组元素minCuts[j+1]将更新为minCuts[j+1]和minCut[i]+1中的最小值
if( (s[i] == s[j])&&( (j-i<2)||isPalin[i+1][j-1] ) )
{
isPalin[i][j] = true;
minCuts[j+1] = min(minCuts[j+1], 1 + minCuts[i]);
}
}
}
return minCuts[N];
}
};
2. 01背包问题c++实现
参考链接:C++ 实现 0-1 背包问题
// knapsack.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
using namespace::std;
/*
0-1 背包问题(迭代版)
输入:
products_count:商品的数量
capacity:背包的容量
weight_array:商品重量数组
value_array:商品价格数组
result:结果数组
*/
void knapsack(int products_count, int capacity, vector<int>& weight_array, vector<int>& value_array, vector<vector<int>>& result)
{
for (int i = 1; i <= products_count; ++i)
{
for (int j = 1; j <= capacity; ++j)
{
if (weight_array[i] > j) // 当前背包的容量 j 放不下第 i 件商品时
{
result[i][j] = result[i - 1][j]; // 放弃第 i 件商品,拿第 i - 1 件商品
}
else
{
int value1 = result[i - 1][j - weight_array[i]] + value_array[i]; // 拿走第 i - 1件商品
int value2 = result[i - 1][j]; // 不拿走第 i - 1 件商品
if (value1 > value2)
{
result[i][j] = value1;
}
else
{
result[i][j] = value2;
}
}
}
}
}
int main()
{
while (1)
{
int products_count, capacity;
vector<int> weight_array(1, 0);
vector<int> value_array(1, 0);
cout << endl<< "-----------------------------" << endl;
cout << "please input products count and knapsack's capacity: " << endl; // 输入商品数量和背包容量
cin >> products_count >> capacity;
cout << "please input weight array for " << products_count << " products" << endl;
for (int i = 1; i <= products_count; ++i) // 循环输入每件商品的重量
{
int tmp;
cin >> tmp;
weight_array.push_back(tmp);
}
cout << "please input value array for " << products_count << " products" << endl;
for (int i = 1; i <= products_count; ++i) // 循环输入每件商品的价格
{
int tmp;
cin >> tmp;
value_array.push_back(tmp);
}
vector<vector<int>> result(products_count + 1, vector<int>(capacity + 1, 0)); // 结果数组
knapsack(products_count, capacity, weight_array, value_array, result); // 调用动态规划算法
cout << "knapsack result is " << result[products_count][capacity] << endl;
}
return 0;
}