1 条题解
-
0
C++ :
#include<iostream> #include<cstring> using namespace std; int main(){ int n;//地窖个数 int f[201];//表示从第i个地窖开始最多挖出的地雷数: int w[201];//表示每个地窖的藏雷数 int c[201];//记录路径 bool a[201][201];//表示从第i个地窖到第j个地窖是否有通路 //初始化数组 memset(f,0,sizeof(f)); memset(w,0,sizeof(w)); memset(c,0,sizeof(c)); memset(a,false,sizeof(a)); cin>>n;//输入地窖的个数 //输入每个地窖的藏雷数 for(int i=1;i<=n;i++){ cin>>w[i]; } int x,y; //输入从第i个地窖到第j个地窖是否有通路 do{ cin>>x>>y; if((x!=0)&&(y!=0)) a[x][y]=true; }while((x!=0)||(y!=0)); int t;//临时变量 存放f[i]的地雷数 int k;//存放最优路径 //从第n个坑开始挖,下面没有坑,也就是第N个坑的雷数 f[n]=w[n]; //从第n-1个坑开始挖 for(int i=n-1;i>=1;i--){ t=0; k=0; //有通路的条件是i<j<=n; a[i][j]=true for(int j=i+1;j<=n;j++){ //有通路,并且下一个坑的地雷数比较多 if((a[i][j]) && (f[j]>t)){ t=f[j]; k=j; } } //从第i个坑开始挖的最大值 f[i]=t+w[i]; c[i]=k; } //计算最多的地雷数 k=1;//假设第一个坑开始挖出地雷数最大多 int max=0;//挖出最多地雷数 //从第二个坑开始和第一个坑比较 for(int j=2;j<=n;j++){ if(f[j]>f[k]){ k=j;//将最大挖雷的坑的序号保存到k } } max=f[k]; cout<<k;//输出起始坑的序号 //输出路径 k=c[k]; while(k!=0){ cout<<"-"<<k; k=c[k]; } cout<<endl; cout<<max<<endl; }
- 1
信息
- ID
- 2200
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者