【七月十九日】今天主要刷了搜索、回溯、DP方面的题目
【任务分配】:题目
#include<iostream> using namespace std; int n,sum=10004,job[12][12],ans; bool flag[12]; void dfs(int x); int main() { scanf("%d",&n); for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&job[i][j]);}} dfs(1); printf("%d",sum); } void dfs(int x) { if(x==n+1){sum=min(sum,ans);return;} for(int i=1;i<=n;i++) { if(flag[i]) continue; ans+=job[x][i]; flag[i]=true; if(ans<sum) dfs(x+1); flag[i]=false; ans-=job[x][i]; } }
【投票问题一】:题目
#include<iostream> using namespace std; long long int m,n,f[101][101]; void dp() { f[0][0]=f[1][0]=1; for(int i=1;i<=n;i++) { for(int j=0;j<=m;j++) { if(i>j) f[i][j]=f[i-1][j]+f[i][j-1]; } } cout<<f[n][m]; } int main() { cin>>n>>m; dp(); return 0; }
【投票问题二】:题目
#include<iostream> using namespace std; long long int m,n,f[101][101]; void dp() { f[0][0]=f[1][0]=1; for(int i=1;i<=n;i++) { for(int j=0;j<=m;j++) { if(i>j) f[i][j]=f[i-1][j]+f[i][j-1]; } } cout<<f[n][m]; } int main() { cin>>n>>m; dp(); return 0; }
【跳马问题一】:题目
#include<iostream> #include<queue> using namespace std; queue<int>x; queue<int>y; int m,n,opx,opy,endx,endy; int f[110][110]; void bfs() { if(x.empty()||y.empty()) {puts("no");exit(0);}//如果队列是空的说明无法到达b点,所以输出no并退出程序 int x1=x.front(); int y1=y.front();//记录头部 x.pop();//释放空间防止内存超限 y.pop(); if(x1==endx && y1==endy) {puts("yes");exit(0);}//判断是否到达B点 if(f[x1][y1]==0 && x1<n && x1>=0 && y1<m && y1>=0) { f[x1][y1]=1; x.push(x1+2); y.push(y1-1);//向四个方向搜索 x.push(x1+2); y.push(y1+1); x.push(x1+1); y.push(y1+2); x.push(x1+1); y.push(y1-2); } bfs();//递归搜索 } int main() { cin>>n>>m>>opx>>opy>>endx>>endy; x.push(opx); y.push(opy); bfs(); //system("pause"); return 0; }
【投票问题三】:题目