最大字段和问题,给定n个整数组成的序列,求序列中字段的最大和
输入:5
-2 11 -4 13 -5 -2
输出:20
#include <stdio.h>
int maxSubArraySum(int a[], int size) {
int max_so_far = a[0];
int curr_max = a[0];
for (int i = 1; i < size; i++) {
curr_max = (a[i] > curr_max + a[i]) ? a[i] : curr_max + a[i];
max_so_far = (max_so_far > curr_max) ? max_so_far : curr_max;
}
return (max_so_far < 0) ? 0 : max_so_far;
}
int main() {
int n;
scanf("%d", &n);
int a[n];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int max_sum = maxSubArraySum(a, n);
printf("%d\n", max_sum);
return 0;
}
//
矩阵的最小路径和,从左上角到右下角,求最小路径之和
输入:4 4
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
输出:12
#include<bits/stdc++.h>
using namespace std;
int m,n,ans;
int a[1000][1000];
int dp[1000][1000];
int Search(){
int i,j;
dp[0][0]=a[0][0];
for(i=1;i<m;i++){
dp[i][0]=dp[i-1][0]+a[i][0];
//dp[i][i]=a[i][i]+dp[i-1][i-1];
}
for(j=1;j<n;j++){
dp[0][j]=dp[0][j-1]+a[0][j];
//dp[i][i]=a[i][i]+dp[i-1][i-1];
}for(i=1;i<m;i++){
for(j=1;j<n;j++){
dp[i][j]=dp[i-1][j]<dp[i][j-1]?(dp[i-1][j]+a[i][j]):(dp[i][j-1]+a[i][j]);
}
}
ans=dp[m-1][n-1];
return ans;
}
int main(){
int k;
cin>>m>>n;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
k=Search();
cout<<ans<<endl;
return 0;
}
//
最长递增子序列,给一个整数数组,求其中的最长递增子序列长度
输入:8
10 9 2 5 3 7 101 18
输出:4
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int nums[n];
for (int i = 0; i < n; i++) {
scanf("%d", &nums[i]);
}
int dp[n];
for (int i = 0; i < n; i++) {
dp[i] = 1;
}
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = (dp[j] + 1 > dp[i]) ? dp[j] + 1 : dp[i];
}
}
}
int max_len = dp[0];
for (int i = 1; i < n; i++) {
if (dp[i] > max_len) {
max_len = dp[i];
}
}
printf("%d\n", max_len);
return 0;
}
//
最优服务次序问题,如何安排n个顾客的服务次序才能使平均等待时间达到最小
输入:10
56 12 1 99 1000 234 33 55 99 812
输出:291.9
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n],num[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
num[0]=0;
int i,time=0;
sort(a,a+n);
for(i=1;i<n;i++){
num[i]=num[i-1]+a[i-1];
}
for(i=0;i<n;i++){
time=time+num[i];
}
printf("%.2lf", 1.0*time/n);
}
//
懒虫小新,有n块矿石,设第i块矿石由两个数字wi和pi表示。分别表示这块石头的重量和可以卖的价钱。小鑫每次只能搬一块矿石去城里卖,所以他决定每次都会搬重量最小的那块。如果恰好有几块重量相等,那就在这几块中挑选价值最高的带走。由于路程原因。小鑫每天只能打m个来回,也就意味着他只能卖掉m块矿石。你能计算出他能得到多少钱么?
输入:4 2
1 2
1 3
2 2
3 4
输出:5
#include <stdio.h>
#include <stdlib.h>
struct node
{
int w;
int p;
}a[10001];
void qsor(struct node a[],int l,int r)
{
int i=l,j=r;
if(l>=r)
return ;
struct node x=a[l];//注意是结构体
while(i<j)
{
while(i<j&&a[j].w>x.w)j--;
while(i<j&&a[j].w==x.w)
{
if(a[j].p<=x.p)//保证价值是降序排列的
j--;
else break;
}
a[i]=a[j];
while(i<j&&a[i].w<x.w)i++;
while(i<j&&a[i].w==x.w)
{
if(a[i].p>=x.p)
i++;
else break;
}
a[j]=a[i];
}
a[i]=x;
qsor(a,i+1,r);
qsor(a,l,i-1);
}
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
for(int i=0;i<n;i++)
{
scanf("%d %d",&a[i].w,&a[i].p);
}
qsor(a,0,n-1);
int sum=0;
for(int i=0;i<m;i++)
{
sum+=a[i].p;
}
printf("%d\n",sum);
}
return 0;
}
//
走迷宫,在一个 m×n 的迷宫里,从起点开始,依次按东(右)、南(下)、西(左)、北(上) 4 个方向探索通路,直至达到终点为止
输入:5 7
W W . W W W W
W . . . W . .
W . W W W . W
W . W . . . W
W W W . W W W
0 2
4 3
输出:None
#include<bits/stdc++.h>
using namespace std;
int m, n;
int start_x, start_y;
int end_x, end_y;
char room[105][105];
int book[105][105];
int flag=0;
void dfs(int x, int y) {
int next[4][2] = {
{0,1},{1,0},{0,-1},{-1,0}
};
if (x == end_x && y == end_y&&flag==0) {
for (int i = 0;i < m;i++) {
for (int j = 0;j < n;j++) {
if (j != n - 1)
cout << room[i][j] << " ";
else
cout << room[i][j] << endl;
}
}
flag=1;
return;
}
int tx=x, ty=y;
for (int i = 0;i < 4;i++) {
tx = x + next[i][0];
ty = y + next[i][1];
if (tx < 0 || ty < 0 || tx >= m || ty >= n)
continue;
if (book[tx][ty] == 0 && room[tx][ty] == '.') {
book[tx][ty] = 1;
room[tx][ty] = '*';
dfs(tx, ty);
room[tx][ty] = 'o';
book[tx][ty] = 0;
}
}
}
int main() {
cin >> m >> n;
for (int i = 0;i < m;i++) {
for (int j = 0;j < n;j++)
cin >> room[i][j];
}
cin >> start_x >> start_y >> end_x >> end_y;
// book[start_x][start_y] = 1;
// room[start_x][start_y] = '*';
dfs(start_x, start_y-1);
if(flag==0)
cout<<"None"<<endl;
}
//
N皇后问题,对于给定的N,求有多少种合理的放置方法
输入:8
输出:92
#include <stdio.h>
#define MAX_N 10
int N;
int count = 0;
int col[MAX_N]; // 记录每一行皇后所在的列号
int is_valid(int row, int c) {
for (int i = 0; i < row; i++) {
if (col[i] == c || abs(col[i] - c) == abs(i - row)) {
return 0;
}
}
return 1;
}
void place_queen(int row) {
if (row == N) {
count++;
return;
}
for (int i = 0; i < N; i++) {
if (is_valid(row, i)) {
col[row] = i;
place_queen(row + 1);
}
}
}
int main() {
scanf("%d", &N);
place_queen(0);
printf("%d\n", count);
return 0;
}