这道题目还是有些歧义,成了环形就难办了啊,感觉就用不了dp了,不符合无后性了
这道题目是树形dp,用了一个晚上学习树形dp
不过我的代码没有通过
#include "iostream" #include "cmath" #include "string.h" using namespace std; int main(){ int n,m,i,j,k,state[220],low[220][220],high[220],set[220],f[220][2],a,b,photon[220],shu[220][220]; while(cin>>n>>m&&n&&m){ for(i=1;i<=n;i++){cin>>state[i];low[i][0]=0;high[i]=0;} for(i=1;i<=m;i++)cin>>photon[i]; for(i=1;i<n;i++){ for(j=i+1;j<=n;j++){ for(k=1;k<=m;k++){ if(abs((float)state[i]-(float)state[j])==photon[k]){ high[i]=j;high[j]=i; low[j][0]++;//low[i][0]++; low[j][low[j][0]]=i;//low[i][low[i][0]]=j; } } } } int MAX=0; for(i=1;i<=n;i++)shu[i][0]=0; for(i=1;i<=n;i++){ int x=i,s=1; memset(set,0,sizeof(set)); while(high[x]!=0&&!set[x]){set[x]=1;x=high[x];s++;} shu[s][0]++; shu[s][shu[s][0]]=i; if(s>MAX)MAX=s; } for(i=MAX;i>=1;i--){ for(j=1;j<=shu[i][0];j++){ if(low[shu[i][j]]==0){ f[shu[i][j]][0]=0;f[shu[i][j]][1]=state[shu[i][j]]; } else { f[shu[i][j]][0]=0;f[shu[i][j]][1]=state[shu[i][j]]; for(k=1;k<=low[shu[i][j]][0];k++){ a=f[low[shu[i][j]][k]][0]; b=f[low[shu[i][j]][k]][1]; f[shu[i][j]][1]+=a; if(a<b)a=b; f[shu[i][j]][0]+=a; } } cout<<shu[i][j]<<' '<<f[shu[i][j]][0]<<' '<<f[shu[i][j]][1]<<endl; } } cout<<high[1]<<"*****"<<endl; int s=0; for(i=1;i<=shu[1][0];i++){ a=f[shu[1][i]][0];b=f[shu[1][i]][1]; if(a<b)a=b; s+=a; } cout<<s<<endl; } }
人家的代码,有很多要学习的地方啊,比如光子,人家用了一个p数组就少了一个for循环,不错啊,而且人家是递归式的,而我是循环式的,他那样比较容易记住形式
#include<iostream> #include<stack> #include<queue> #include<stdio.h> #include<algorithm> #include<string.h> #include<cmath> #define ll long long #define oo 1000000007 #define MAXN 205 using namespace std; vector<int> Tree[MAXN]; int n,m,a[MAXN],dp[MAXN][2]; bool P[1000005],used[MAXN],root[MAXN]; void dfs(int x) { int i,num=Tree[x].size(); used[x]=true; dp[x][0]=0,dp[x][1]=a[x]; for (i=0;i<num;i++) if (!used[Tree[x][i]]) { dfs(Tree[x][i]); dp[x][0]+=max(dp[Tree[x][i]][0],dp[Tree[x][i]][1]); dp[x][1]+=dp[Tree[x][i]][0]; } return; } int main() { int i,x; while (~scanf("%d%d",&n,&m) && (n || m)) { for (i=1;i<=n;i++) scanf("%d",&a[i]),Tree[i].clear(); sort(a+1,a+1+n); memset(P,false,sizeof(P)); P[0]=true; for (i=1;i<=m;i++) scanf("%d",&x),P[x]=true; memset(root,true,sizeof(root)); for (i=1;i<=n;i++) for (x=i+1;x<=n;x++) if (P[a[x]-a[i]]) Tree[x].push_back(i),Tree[i].push_back(x); memset(used,false,sizeof(used)); x=0; for (i=1;i<=n;i++) if (!used[i]) { dfs(i); x+=max(dp[i][0],dp[i][1]); } printf("%d ",x); } return 0; }