路漫漫其修远兮,吾将上下而求索
洛谷P1352 没有上司的舞会(树形dp)
#include<bits/stdc++.h>
#define ll long long
#define N 6005
using namespace std;
vector<int>son[N];
int v[N],n,dp[N][2];
bool vis[N];
void dfs(int x){
dp[x][1]=v[x];
for(auto it:son[x]){
dfs(it);
dp[x][0]+=max(dp[it][1],dp[it][0]);
dp[x][1]+=dp[it][0];
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>v[i];
for(int i=1;i<n;i++){
int l,k;
cin>>l>>k;
son[k].push_back(l);
vis[l]=true;
}
for(int i=1;i<=n;i++){
if(!vis[i]){
dfs(i);
cout<<max(dp[i][1],dp[i][0]);
break;
}
}
return 0;
}
洛谷P2014 选课(树形dp)
#include<bits/stdc++.h>
#define ll long long
#define N 305
using namespace std;
int n,m,dp[N][N],k,v[N];
vector<int>son[N];
void dfs(int x){
for(int i=1;i<=m;i++) dp[x][i]=v[x];
for(auto it:son[x]){
dfs(it);
for(int j=m;j>=1;j--){
for(int k=0;k<=j-1;k++){
dp[x][j]=max(dp[x][j],dp[x][j-k]+dp[it][k]);
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>k>>v[i];
son[k].push_back(i);
}
m++;
dfs(0);
cout<<dp[0][m];
return 0;
}
洛谷P1435 回文字串(最长公共子序列)
#include<bits/stdc++.h>
#define ll long long
#define N 1005
using namespace std;
int dp[N][N],n;
string s1,s2;
int main()
{
cin>>s2;
s1=s2;
reverse(s2.begin(),s2.end());
n=s1.length();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(s1[i-1]==s2[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j-1],max(dp[i-1][j],dp[i][j-1]));
}
}
cout<<n-dp[n][n];
return 0;
}
洛谷P1064 金明的预算方案(树形dp)
#include<bits/stdc++.h>
#define ll long long
#define N 3201
#define M 61
using namespace std;
int n,m,dp[M][N],k,v[M],w[M];
vector<int>son[M];
void dfs(int x){
for(int i=w[x];i<=n;i++) dp[x][i]=v[x];
for(auto it:son[x]){
dfs(it);
for(int j=n;j>=w[x];j--){
for(int k=0;k<=j-w[x];k++){
dp[x][j]=max(dp[x][j],dp[x][j-k]+dp[it][k]);
}
}
}
}
int main()
{
cin>>n>>m;
n/=10;
for(int i=1;i<=m;i++){
int a;
cin>>w[i]>>a>>k;
v[i]=w[i]*a;
w[i]/=10;
son[k].push_back(i);
}
dfs(0);
/*for(int j=1;j<=5;j++){
for(int i=10;i<=100;i+=10){
cout<<"第"<<j<<"个点:"<<i<<"容量:"<<dp[j][i]<<' ';
}
cout<<endl;
}*/
cout<<dp[0][n];
return 0;
}
洛谷P1776 宝物筛选(背包二进制优化)
#include<bits/stdc++.h>
#define ll long long
#define N 100005
#define M 61
using namespace std;
int n,m,dp[N],v,w,sum,k;
int main()
{
cin>>m>>n;
while(m){
cin>>v>>w>>sum;
k=1;
while(sum>k){
sum-=k;
v*=k,w*=k;
for(int i=n;i>=w;i--) dp[i]=max(dp[i],dp[i-w]+v);
v/=k,w/=k;
k*=2;
}
v*=sum,w*=sum;
for(int i=n;i>=w;i--) dp[i]=max(dp[i],dp[i-w]+v);
m--;
}
cout<<dp[n];
return 0;
}
洛谷P1854 花店橱窗布置(我认为是递推)
#include<bits/stdc++.h>
#define ll long long
#define N 200005
#define M 61
using namespace std;
int n,m,arr[105][105],p[105][105],dp[105][105],ans=-99999999;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>arr[i][j];
for(int i=1;i<=m;i++) dp[1][i]=arr[1][i];
for(int i=2;i<=n;i++){
for(int j=i;j<=m;j++){
p[i][j]=i-1;
dp[i][j]=dp[i-1][i-1]+arr[i][j];//初始化
for(int k=i;k<=j-1;k++){
if(dp[i][j]<dp[i-1][k]+arr[i][j]){
dp[i][j]=dp[i-1][k]+arr[i][j];
p[i][j]=k;
}
}
}
}
int k;
for(int i=n;i<=m;i++){
if(dp[n][i]>ans){
ans=dp[n][i];
k=i;
}
}
cout<<ans<<endl;
vector<int>a;
a.push_back(k);
for(int i=n;i>=2;i--){
k=p[i][k];
a.push_back(k);
}
reverse(a.begin(),a.end());
for(auto it:a) cout<<it<<' ';
return 0;
}
最后还写了洛谷P1886 滑动窗口/单调队列模板题
#include<bits/stdc++.h>
#define ll long long
#define N 1000005
using namespace std;
deque<int>l,s;//large small
int n,k,a[N];
void pushs(int x){
while(!s.empty()){
if(a[s.back()]>=a[x]) s.pop_back();
else break;
}
s.push_back(x);
}
void pushl(int x){
while(!l.empty()){
if(a[l.back()]<=a[x]) l.pop_back();
else break;
}
l.push_back(x);
}
void pops(int x){
while(!s.empty()){
if(s.front()<=x) s.pop_front();
else break;
}
}
void popl(int x){
while(!l.empty()){
if(l.front()<=x) l.pop_front();
else break;
}
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=k;i++)
pushs(i);
cout<<a[s.front()]<<' ';
for(int i=k+1;i<=n;i++){
pushs(i);
pops(i-k);
cout<<a[s.front()]<<' ';
}
cout<<endl;
for(int i=1;i<=k;i++)
pushl(i);
cout<<a[l.front()]<<' ';
for(int i=k+1;i<=n;i++){
pushl(i);
popl(i-k);
cout<<a[l.front()]<<' ';
}
return 0;
}
希望通过我的努力能拿到一点成绩