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;
}