动态规划问题中的几个经典问题代码

来源:互联网 发布:淘宝摄影店 编辑:程序博客网 时间:2024/05/23 00:47

动态规划经典问题描述:http://www.cnblogs.com/little-YTMM/p/5372680.html

动态规划过程详细步骤:http://blog.csdn.net/a45872055555/article/details/29224177

求一个序列的最大非降序子序列问题:

#include <iostream>
using namespace std;


int lis(int A[], int n)
{
int *d = new int[n];//创建一个数组来存储序列中每个位置的最长子序列的值
int len = 1;
for (int i = 0; i < n; ++i)
{
d[i] = 1;
for (int j = 0; j < i; ++j)
if (A[j] <= A[i] && d[j] + 1 > d[i])//这句话就表示在A[j]<=A[i] 的情况下,找出d[i]前面中的最大值+1赋给d[i]
d[i] = d[j] + 1;
if (d[i] > len) len = d[i];
}
delete[] d;
return len;
}


int main()
{
int A[] = { 5,3,4,8,6,7 };
cout << lis(A, 6) << endl;
system("pause");
return 0;
}


动态规划取苹果问题:

#include <iostream>
using namespace std;


int Apple(int **A, int n, int m)
{
int** s = new int*[n];
for (int i = 0; i < n; ++i)
s[i] = new int[m];
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
int increment = A[i][j];
int left = 0, up = 0;
if (i > 0)
up = s[i - 1][j];
if (j > 0)
left = s[i][j - 1];
int neighbor = left >= up ? left : up;
s[i][j] = neighbor + increment;
}
}
int result = s[n - 1][m - 1];
for (int i = 0; i < n; ++i)
delete[] s[i];
delete[] s;
return result;
}


int main()
{
int N, M,n;
cin >> N >> M;
int** d = new int*[N];
for (int i = 0; i < N; ++i)
d[i] = new int[M];
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
cin >> d[i][j];
int res = Apple(d, N, M);
cout << res << endl;
system("pause");
return 0;
}



原创粉丝点击