解题思路:动态规划(从集合角度思考)

注意事项:弄清状态表示与状态计算 这里分成两大类:(1)最后一步是从上往下走 (2)最后一步是从左往右走

两大类再细分取与不取  故写成四种状态 :

f[i-1,j,k,c]  f[i,j-1,k,c] f[i-1,j,k-1,c] f[i,j-1,k-1,c'] 其中c'<c

 

参考代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N = 55, MOD=1000000007;
int f[N][N][13][14];
int w[N][N];
int n,m,k;

int main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            cin>>w[i][j];
            w[i][j]++;
        }
    
    f[1][1][1][w[1][1]]=1;
    f[1][1][0][0]=1;
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(i==1&&j==1) continue;
            for(int u=0;u<=k;u++)
                for(int v=0;v<=13;v++)
                {
                    int &val=f[i][j][u][v];
                    val=(val+f[i-1][j][u][v])%MOD;
                    val=(val+f[i][j-1][u][v])%MOD;
                    if(u>0&&v==w[i][j])
                    {
                        for(int c=0;c<v;c++)
                        {
                            val=(val+f[i-1][j][u-1][c])%MOD;
                            val=(val+f[i][j-1][u-1][c])%MOD;
                        }
                    }
                }
        }

    
    int res=0;
    for(int i=0;i<=13;i++) res=(res+f[n][m][k][i])%MOD;
    
    cout << res << endl;
    return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论