动态规划
(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;
}

浙公网安备 33010602011771号