0
点赞
收藏
分享

微信扫一扫

基础算法训练题

修炼之士 2022-02-17 阅读 48

dp

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10010;
int m[N][N],res;
int main(){
	int n;
	cin>>n;
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= n;j ++){
			cin>>m[i][j];
		}
	}
	m[0][1] = m[1][0] = 0;
	for(int i = 1;i <= n;i ++){
		for(int j = 1;j <= n;j ++){
			m[i][j] = max(m[i][j] + m[i-1][j],m[i][j-1] + m[i][j]);
		}
	}
	
	for(int i = 1;i <= n;i ++){
		res = max(m[n][i],res);
	}
	
	cout<<res;
	
	return 0;
}

dp

 关键点是将情况分为 :与之前的重复 或者不重复 两种.

#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
int main() {
	double dp[25][25], p;
	int n, m, i, j;
	cin >> n >> m;
	p = 1.0 / n;
	for (i = 1; i <= m; ++i) {
		for (j = 1; j <= n; ++j) {
			if (j > i) {
				dp[i][j] = 0;
			}
			if (j == 1) {
				dp[i][j] = pow(p, i - 1);
			}
			else {
				dp[i][j] = dp[i - 1][j] * (1.0 * j / n) + dp[i - 1][j - 1] * ((n - j +1) * 1.0 / n);
                           // 重复的概率 + 不重复的概率
			}
		}
	}
	printf("%.4lf", dp[m][n]);
	return 0;
}

搜索

思路:
使用do{}while(next_permutation(a,a+n))函数将数组当中的数按照从小到大的字典序进行排列
然后定义一个判断的数字,当sum算到随后的和为输入的那个数的时候判断的数字就改变
终止循环,否则循环到最后一个字典序最大的数组
如果判断条件对了,就输出这个数组,如果判断条件错了就不输出

 

#include <iostream>
#include <iomanip>
#include <climits>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
int main()
{
	int a[20], b[20];
	int k = 0, j;
	int n, sum;
	cin >> n >> sum;
	j = n;
	for (int i = 0; i < n; i++)
		a[i] = i + 1;
	do {
		for (int i = 0; i < n; i++) {
			b[i] = a[i];
		}
		while (j > 1) {
			for (int i = 0; i < n - 1; i++) {
				b[i] = b[i] + b[i + 1];
			}
			j--;
		}
		j = n;
		if (b[0] == sum) {
			k = 1;
			break;
		}
	} while (next_permutation(a, a + n));
	if (k == 1) {
		for (int i = 0; i < n; i++)
			cout << a[i] << " ";
	}
	return 0;
}

搜索

 

#include<iostream>
#include<algorithm>
using namespace std;
int book[10] = { 0 }, a[10] = { 0 }, b[10] = { 0 };
//book检测是否用了,a用来记录数据,b用来当作容器

int temp = 9999999;
int n, m;
void dfs(int step, int pos)
{
	if (step > n)//选出最大最小值进行相减,比较
	{
		int ma = b[1], mi = b[1];
		for (int k = 1; k <= m; k++)
		{
			ma = max(ma, b[k]);
			mi = min(mi, b[k]);
		}
		temp = min(temp, ma - mi);
		return;
	}
	int i, j;
    //枚举每根木棍放进容器的选择
	for (i = pos; i <= n; i++)
	{
		for (j = 1; j <= m; j++)
		{
			if (book[i])
				break;
			book[i] = 1;
			b[j] += a[i];
			dfs(step + 1, i + 1);
			book[i] = 0;
			b[j] -= a[i];
		}
	}
	return;
}
int main(void)
{
	
	cin >> n >> m;
	int i;
	for (i = 1; i <= n; i++)
		cin >> a[i];
	dfs(1, 1);
	cout << temp;
	return 0;
}
举报

相关推荐

0 条评论