sdut 2878 Circle 高斯消元
2016-05-23 20:41
417 查看
题意:
在一个0~n的环上每次可以向左走或向右走求走到x的步数的期望
分析:
因为是环形的不好递推
考虑到 dp【i】=dp【(i+1)%n】/2+dp【(i-1)%n】/2+1
可以转化为 dp【i】-dp【(i+1)%n】/2-dp【(i-1)%n】/2=1
所以可以列n个方程利用高斯消元来解貌似网上有别的做法表示看不懂orz
ACcode:
#include <cmath> #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #define maxn 1005 using namespace std; double a[maxn][maxn],x[maxn]; double Gauss(int n){ int row,col,max_r; int equ=n,var=n; for(row=0,col=0;row<equ&&col<var;row++,col++){ max_r=row; for(int i=row+1;i<var;i++) if(fabs(a[i][col])>fabs(a[max_r][col])) max_r=i; if(max_r!=row) for(int j=row;j<n+1;j++) swap(a[max_r][j],a[row][j]); for(int i=row+1;i<var;i++) if(fabs(a[i][col])>=1e-8){ double tmp=a[i][col]/a[row][col]; for(int j=col;j<n+1;j++) a[i][j]-=a[row][j]*tmp; } } for(int i=equ-1;i>=0;i--){ double tmp=a[i] ; for(int j=i+1;j<n;j++) if(fabs(a[i][j])>1e-8) tmp-=a[i][j]*x[j]; x[i]=tmp/a[i][i]; } return x[0]; } int main(){ int loop,my_x,n; scanf("%d",&loop); while(loop--){ scanf("%d%d",&n,&my_x); memset(a,0,sizeof(a)); for(int i=0;i<n;++i) if(i!=my_x){ a[i][i]=a[i] =1; a[i][(i-1+n)%n]=a[i][(i+1)%n]=-0.5; } a[my_x][my_x]=1;a[my_x] =0; printf("%.4lf\n",Gauss(n)); } return 0; }
相关文章推荐
- Astar Round2A
- Genymotion如何启动网络连接
- python中内置函数locals()和gloabls()解析
- Leetcode 83. Remove Duplicates from Sorted List
- oracle导入csv文本文件到vertica
- 【数据结构】非比较排序算法(实现计数排序和基数排序)
- 有了这个列表,程序员不愁没练手的小项目了
- 最小生成树 Kruskal算法
- Java读取配置文件
- App接口的设计
- java系统参数
- poj1170shopping office(DP背包问题)
- web测试一般分为那几个阶段,哪些阶段是可以用工具实现的,都有些什么工具,哪些阶段必须要人工手动来实现呢?
- 实践——模块
- LK源码解析 2 main.c
- Reorder List
- STL之Set自定义排序
- Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)
- 拓扑排序
- hdoj2052Picture