upc 无重力 (dancer)(dp)

    技术2023-05-15  84

    题目描述

    「人类不会主动思考。」 曾几何时,天上的神只有一位,然而这话并非出自她口。 那么,这个判定,又是什么样的权威做出的呢? 「『世界是什么时候开始变成这个样子的?几天前?几个月前?还是很多年以前?抑或原本就是如此,不曾改变?』若没有体验过物是人非,没有人会主动思考这样的问题,人类永远是只记得瞬间的孩子。早上起来第一眼看到什么样的世界,就会本能地认为之前数千年的时光都是这样过来的。只要忍耐或是麻木得足够长,足够久,再特别的记忆也会变成单纯的、无法体验的理论。」 然而,依然有人记得,这段话,并非与世界的历史同源。 「所以呢?思考这样的问题,又有什么样的用处呢?」

    一位有着「绯色瞳孔」的舞者。 曾以「神赐之眼」与「治愈之舞」而闻名的舞者。 她想要融入人群。 她是一名舞者。 她会在人群中表演,从而融入群众。 假设人群是一个矩阵,总共有N行M列的人,而她在第一行前面。由于出题人也不知道的原因,她会一行一行地渐渐融入人群。 对于某个第i行第j列的人,只有在此人所要花表演时间tij,他才能接受舞者。同时,若一行的某一个人接受了舞者,那么同一行所有人都会接受舞者。 但是每个人有一个审美观aij,也就是说舞者的舞技只有大于等于aij,那个人才会欣赏她的表演。 假设,舞者的舞技初始为X,她可以在第一行选某一个人表演,再在第二行选一个人……以此类推,一直到行。 对于每次选的人(i,j)(满足aij不小于X),花tij的时间来表演。然后由于某种特殊的原因,表演完她的舞技会更新为cij。 她想知道当她完全融入这个人群后(即每行都选了一个人),她所需最少的时间是多少? 若舞者无法融入人群,输出-1。

    输入

    第一行三个数,分别是N,M,X。 接下来要输入三个矩阵,输入格式都是 输入N行 每行M个数。 第一个矩阵,代表tij。 第二个矩阵,代表aij。 第三个矩阵,代表cij。

    输出

    一行,表示她所需要的最少时间。

    样例输入 Copy

    2 3 17 7 3 8 9 5 3 12 22 25 12 11 23 15 17 19 11 21 15

    样例输出 Copy

    12

    提示

    代码:
    #include <iostream> #include <string.h> #include <cstdio> #include <algorithm> #include <queue> #include <vector> #define ll long long #define inf 0x3f3f3f3f #define pii pair<int, int> const int mod=1e9+7; const int N=510; using namespace std; int n,m,x; int t[N][N],c[N][N],a[N][N],dp[N][N]; //dp[ i ] [ j ] 代表在第 i 行选择了第 j 个人的最小时间花费 int main() { memset(dp,inf,sizeof(dp)); cin>>n>>m>>x; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>t[i][j]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>a[i][j]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>c[i][j]; } } for(int i=1;i<=m;i++) { if(x>=a[1][i]) dp[1][i]=t[1][i]; } for(int i=2;i<=n;i++) { for(int j=1;j<=m;j++) { for(int k=1;k<=m;k++) { if(dp[i-1][k]==inf) continue; //如果上一行的第 k 个人在上一次选 //人中没被选中过,那接下来将再也用不到他,遇见直接跳过 if(c[i-1][k]>=a[i][j]) { dp[i][j]=min(dp[i][j],dp[i-1][k]+t[i][j]); } } } } int ans=inf; for(int i=1;i<=m;i++) { ans=min(ans,dp[n][i]); } if(ans==inf) cout<<"-1"; else cout<<ans; }
    Processed: 0.019, SQL: 9