|
板凳
楼主 |
发表于 2015-11-3 19:41:09
|
只看该作者
本帖最后由 diggersun 于 2015-11-4 19:46 编辑
有点技巧的DP做法
其实这种简单的DP可以认为是递推,因为排列的顺序是由小到大的,那么用 a(x,y)表示第X个位置放上满了第Y种花,或者说Y种花摆满X个位置的所有可能情况,那么
a(x-1,y-1)就是y-1种花摆满x-1个位置,我们最后在x位置摆上第Y种花就可以得到 A(x y)
a(x-2,y-1)就是y-1种花摆满x-2个位置,我们最后在x-1和x位置摆上第Y种花就可以得到 A(x y) 当然第y种花要有2颗可以选择
****
然后累加。
- #include <iostream>
- #include <iomanip>
- using namespace std;
- int a[101][101];
- int c[101];
- int n,m,i,j,k,s;
- int main()
- {
- cin>>n>>m;
- for (i=1; i<=n; i++) cin>>c[i];
- //for (i=0; i<=n; i++) a[i][0]=1;
- a[0][0]=1;
- for (i=1; i<=n; i++)
- for (j=0; j<=m; j++)
- for (k=0; k<=c[i]; k++)
- if (j-k>=0) a[j][i]=(a[j][i]+a[j-k][i-1]);
- for (i=0; i<=n; i++)
- {for (j=0; j<=m; j++) cout<<setw(3)<<a[j][i];
- cout<<endl;}
- cout<<a[m][n];
- return 0;
- }
复制代码 |
|