-
递推/DP(动态规划)UVA 10081-Tight Words
-
题目链接:10081 - Tight Words
-
思路:
题目大意是有一个序列长度为n,是由0~k组成的,问得到序列相邻数字差距不大于1的概率是多少
假设目前已经排好了 前 i-1个数字,目前要排第i个数字,并且第i个数字是 j,那么第i个数字与相邻(也就是第i-1个数字)差距不大于的情况只有当i-1个数字为:j >=0 下的j-1,j,j+1,把长度i-1序列可能情况概率加起来乘上 1/(k+1)---因为第i个数字为j的概率为 1/(k+1)
DP初态是i=1时,这个时候数字为j(j>=0,j<=k)的概率为 1/(k+1)
-
代码:
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int k,n;
while(cin>>k>>n)
{
double DP[105][10]={0};
double Res=0.0;
for(int i=0;i<=k;i++)
DP[1][i]=1.0/(k+1);
for(int i=2;i<=n;i++)
{
for(int j=0;j<=k;j++)
{
for(int l=0;l<=k;l++)
if(abs(l-j)<=1) //ok
{
DP[i][j]+=DP[i-1][l]*(1.0/(k+1));
//cout<<DP[i][j]<<endl;
}
}
}
for(int i=0;i<=k;i++)
Res+=DP[n][i];
cout<<fixed<<setprecision(5)<<Res*100<<endl;
}
return 0;
}