动态规划

(1)数塔问题

//数塔问题:给定一个数塔,从顶部出发,在每一个节点可以选择向左走或者向右走,一直走到底,找一条路径,使路径上的所有数字和最大
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 105;
int data[N][N];
int dp[N][N];
int main(){
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++){
		for (int j = 1; j <= i; j++){
			cin >> data[i][j];
		}
	}
	for (int i = 1; i <= n; i++){
		dp[n][i] = data[n][i];
	}
	for (int i = n - 1; i >= 1; i--){
		for (int j = 1; j <= i; j++){
			dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + data[i][j];
		}
	}
	cout << dp[1][1] << endl;
	system("pause");
	return 0;
}

 方式二:

//增加一个维度保存方向信息,
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 105;
int data[N][N][3];
int main(){
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++){
		for (int j = 1; j <=i; j++){
			cin >> data[i][j][0];
			data[i][j][1] = data[i][j][0];//data[i][j][1]用于存储动态规划过程中的状态信息
			data[i][j][2] = 0;
		}
	}
	for (int i = n - 1; i >= 1; i--){
		for (int j = 1; j <=i; j++){
			data[i][j][1] = max(data[i + 1][j][1], data[i + 1][j + 1][1]) + data[i][j][1];
		
		}
	}
	cout << data[1][1][1] << endl;
	system("pause");
	return 0;
}

(2)矩阵连乘问题

 

(3)大整数乘法

//大整数乘法
#include<iostream>
using namespace std;
int multi(char s1[], char s2[], int a[]){
	//初始化a
	for (int i = 0; i < 255; i++){
		a[i] = 0;
	}
	int n1 = strlen(s1);
	int n2 = strlen(s2);
	//进位d
	long d = 0;
	long b = 0,n;
	int i;//对应结果的位数
	int k, j, i1, i2;//计算时k,j分别指向对应的数字,i1,i2指向位数的个数
	for (i1 = 0, k = n1 - 1; i1 < n1; i1++, k--){
		for (i2 = 0, j = n2 - 1; i2 < n2; i2++, j--){
			i = i1 + i2;
			b =a[i]+ (s1[k] - 48)*(s2[j] - 48) + d;//这里使用了d,所以d必须赋初值
			a[i] = b % 10;
			d = b / 10;
		}
		while (d>0){
			i++;
			a[i] += d % 10;
			d /= 10;
		}
		n = i;
	}
	return n;
}
int main(){
	int x[1001];//存放计算结果
	char s1[1001], s2[1001];
	gets_s(s1);
	gets_s(s2);
	int m=multi(s1, s2, x);
	for (int i = m; i >= 0; i--){
		cout << x[i];
	}
	cout << endl;
	system("pause");
	return 0;
}

(5)二叉树的构建  根据先序遍历虚列构建二叉树

//根据先序遍历序列创建树,输出先序、中序,后序序列
#include<iostream>
using namespace std;
//节点定义
struct node{
	char data;
	node * leftChild, *rightChild;
};
node * createTree(){
	node * root;
	char ch;
	cin >> ch;
	if (ch == '@'){
		root = NULL;
	}
	else{
		//分配内存空间
		root = (struct node*)malloc(sizeof(node));
		root->data = ch;
		root->leftChild = createTree();
		root->rightChild = createTree();
	}
	return root;
}
void preOrder(node * root){
	if (!root){ return; }
	cout << root->data << " ";
	preOrder(root->leftChild);
	preOrder(root->rightChild);

}
void inOrder(node * root){
	if (!root){ return; }
	inOrder(root->leftChild);
	cout << root->data << " ";
	inOrder(root->rightChild);
}
void postOrder(node * root){
	if (!root){ return; }
	postOrder(root->leftChild);
	postOrder(root->rightChild);
	cout << root->data << " ";
}
int main(){
	struct node * root=createTree();
	preOrder(root);
	cout << endl;
	inOrder(root);
	cout << endl;
	postOrder(root);
	cout << endl;
	system("pause");
	return 0;
}

(6)吏狱问题

//吏狱问题:即是求1到n中每一个数的因子个数为奇数
//所有小于n的完全平方数的因子个数为奇数
#include<iostream>
using namespace std;
void solution(int n){
	int temp;
	for (int i = 1; i <= n; i++){
		temp = (int)sqrt(i);
		if (temp*temp == i){
			cout << i << " ";
		}
	}
}
int main(){
	int n;
	cin >> n;
	solution(n);
	system("pause");
	return 0;
}

(7)逆素数

#include<iostream>
using namespace std;
bool isPrime(int n){
	for (int i = 2; i <= sqrt(n); i++){
		if (n%i == 0){
			return false;
		}
	}
	return true;
}
int turn(int n){
	//讲一个数逆置
	int res = 0;
	while (n){
		int a = n % 10;
		res *= 10;
		res = res + a;
		n /= 10;
	}
	return res;
}
int main(){

	int n, m;
	cin >> n >> m;
	for (int i = n; i <= m; i++){
		if (!isPrime(i)){
			continue;
		}
		else if (isPrime(turn(i)) && i < turn(i)){
			cout << i << endl;//输出较小的那一个
		}
	}
	system("pause");
	return 0;
}

(8)水仙花数  一个三位数的各个位置的数字立方和为该数本身,则该数为水仙花数

#include<iostream>
using namespace std;
int main(){
	int a, b, c;
	for (int i = 100; i < 1000; i++){
		a = i / 100;
		c = i % 10;
		b = (i / 10) % 10;
		if ((a*a*a + b*b*b+c*c*c) == i){
			cout << i << " ";
		}
	}
	system("pause");
	return 0;
}

  

(9)完数   一个数的所有因子之和为该数本身,则该数为完数

#include<iostream>
using namespace std;
int main(){
	int n;
	cin >> n;
	for (int i = 2; i <= n; i++){
		int sum = 0;
		for (int j = 1; j <i; j++){
			if (i%j == 0){
				sum += j;
			}
		}
		if (sum == i){
			cout << i << "its factors are " << endl;
			for (int j = 1; j < i; j++){
				if (i%j == 0){
					cout << j << " ";
				}
			}
			cout << endl;
		}

	}
	system("pause");
	return 0;
}

  

 

posted @ 2020-10-20 17:56  goldstine  阅读(79)  评论(0)    收藏  举报