动态规划
乐***对
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; }