动态规划

乐***对

https://ac.nowcoder.com/acm/contest/6874/B

乐***对
题目https://ac.nowcoder.com/acm/contest/6874/B

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    vector<int>p(n+1);
    for(int i=1;i<=n;i++){
        scanf("%d",&p[i]);
    }
    vector<int>dp(n+1);
    int ans=0;
    sort(p.begin()+1,p.end());//按能力值排序
    dp[0]=0;//p[i]为人数为i是最大组对数
    for(int i=1;i<=n;i++){
        if(i<p[i])ans=0;//人数小于能力值,ans为0
        else ans=dp[i-p[i]]+1;
        dp[i]=max(ans,dp[i-1]);
    }
    if(!ans)ans=-1;
    printf("%d",ans);
}

分组
题目https://ac.nowcoder.com/acm/problem/24190

# include <cstdio>
# include <iostream>
# include <algorithm>
using namespace std;
const int N=10005;
int n,k,a[N],f[N];

int main () {
    scanf ("%d%d",&n,&k);
    for (int i=1;i<=n;i++) scanf ("%d",&a[i]);
    for (int i=1;i<=n;i++) {
        int sum=-1e9;
        for (int j=i;i-j+1<=k&&j>=1;j--) {//这里注意一下,j不仅要保证在k个以内,还要大于等于1
            sum=max(sum,a[j]);
            f[i]=max(f[i],f[j-1]+sum*(i-j+1));
        }
    }
    printf ("%d\n",f[n]);
    return 0;
}

青蛙
题目https://ac.nowcoder.com/acm/contest/8417/G

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
const int N = 3e3+500;
const int inf = -0xfffffff;
using namespace std;
vector<vector<int>>a(N, vector<int>(N,inf));
int main()
{
    ios;
    int n;
    cin >> n;
    int start = n;
    int i;
    for (i = 1; i <= n; i++) {
        for (int j = start; j <= n+i-1; j += 2) {
            if (i == 1)cin >> a[i][j];
            else {
                cin >> a[i][j];
                a[i][j] += max({a[i - 1][j - 1], a[i - 1][j + 1], a[i-2][j]});
            }
        }
        start--;
    }
    start = 2;
    for (; i <= 3 * n - 3; i++) {
        for (int j = start; j <= 2*n-start; j += 2) {
            cin >> a[i][j];
            a[i][j] += max({a[i - 1][j - 1], a[i - 1][j + 1], a[i-2][j]});
        }
        if (start == 2)start = 1;
        else start = 2;
    }
    start = 1;
    for (; i <= 4 * n - 3; i++) {
        for (int j = start; j <= 2*n - start; j += 2) {
            if (i == 1)cin >> a[i][j];
            else {
                cin >> a[i][j];
                a[i][j] += max({a[i - 1][j - 1], a[i - 1][j + 1], a[i-2][j]});
            }
        }
        start++;
    }
    cout << a[4 * n - 3][n] << endl;
}
全部评论

相关推荐

点赞 评论 收藏
分享
代码飞升:别用口语,后端就写后端,前端就写前端,最后别光后悔
点赞 评论 收藏
分享
05-09 14:45
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务