很久没做过DP了, 这题的状态转移方程是dp[i][j]=dp[i-1][j+1]+dp[i-1][j-1], 当然,要注意边界的处理和初始化。开始时我觉得可以将其状态由二维压缩到一维, 写出来了结果发现多了很多, 再仔细想了一下,发现这个没法压缩到一维, 因为j 在j-1和j+1中间……
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n, pos, m, t;
int i, j;
while( cin>>n>>pos>>m>>t )
{
int dp[101][101]={0};
dp[0][pos]=1;
for(i=1; i<=m; i++)
{
for(j=n; j>=1; j--)
{
if( j+1>n ) dp[i][j]+=dp[i-1][j-1];
else if(j-1<0 ) dp[i][j]+=dp[i-1][j+1];
else dp[i][j]+=(dp[i-1][j-1]+dp[i-1][j+1]);
}
}
cout<<dp[m][t]<<endl;
}
}