2 条题解
-
0
#include<bits/stdc++.h> using namespace std; int n,a[105],ma[105],maxxx[105][105],cnt[105],macnt,maa[105],maxx; /* mamxx为到i最优方案 cnt为到i最优方案挖雷次数 macnt为总最优方案挖雷次数 maa为总最优方案 maxx为能挖到最多的地雷数 */ bool b[105][105]; int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++){ cin>>b[i][j]; } } for(int i=n;i>=1;i--){ //一定要倒着推,这样才能找到前面走过的路径 int s=0; for(int j=i;j<=n;j++){ if(b[i][j]==1){//当有通路 if(ma[j]>s){ s=ma[j]; cnt[i]=cnt[j]; for(int k=1;k<=cnt[j];k++){ maxxx[i][k]=maxxx[j][k]; }//转移推出最优方案 } } } ma[i]=s+a[i];cnt[i]++; maxxx[i][cnt[i]]=i;//把i放入方案 if(ma[i]>maxx){ maxx=ma[i];macnt=cnt[i]; for(int j=1;j<=macnt;j++) maa[j]=maxxx[i][j];//再推出总最优方案 } } cout<<maxx<<endl; for(int i=macnt;i>=1;i--) cout<<maa[i]<<" "; //因为是倒着推的,所以路径也是反的,因题目要求输出正的方案,所以要反的输出 return 0; } /* 6 8 14 2 17 9 26 0 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 */
-
0
#include<bits/stdc++.h> using namespace std; int main() { int t,maxn,n,i,j,v[105]={},a[105],b[105][105]={},f[105]={}; bool x; cin>>n; for(i=1;i<=n;++i) { cin>>a[i]; f[i]=a[i]; } for(i=1;i<=n;++i) for(j=i;j<=n;++j) { cin>>x; b[i][j]=x; } f[n]=a[n]; for(i=n-1;i>=1;--i) { maxn=0; t=0; for(j=i+1;j<=n;++j) if(b[i][j]) { if(maxn<f[j]) { maxn=f[j]; t=j; } } v[i]=t; f[i]=maxn+a[i]; } maxn=-1; t=0; for(i=1;i<=n;++i) if(maxn<f[i]) { maxn=f[i]; t=i; } cout<<maxn<<'\n'; cout<<t; while(v[t]) { t=v[t]; cout<<' '<<t; } return 0; }
- 1
信息
- ID
- 23
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 148
- 已通过
- 75
- 上传者