UVA - 10599 Robots(II)

来源:互联网 发布:降低温度析出沉淀算法 编辑:程序博客网 时间:2024/04/30 02:22
题意:给出一个矩阵的长和宽,还有矩阵上的一些垃圾,问从(1,1)到(row,col)最多能够捡到多少垃圾,和有最的情况有几种,走的方向只有下和右。可以转化为LIS,因为方向只有下和右,所以从左上角到右下角总是非递减的,加一个条件:方向必须是斜向下的,就是LIS了如果(row,col)没有垃圾的话,我们也要加上,方便计算,最后还要求输入任意的路径,判断的输出(row,col)就可以了,还有一点就是当dp[i]==dp[j+1]的时候,num[i] = num[i] + num[j]#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 110;const int MAXD = 10010;bool g[MAXN][MAXN];int n,seq[MAXD],dp[MAXD],pre[MAXD],num[MAXD];int row,col;void solve(){    n = 0;    for (int i = 1; i <= row; i++)        for (int j = 1; j <= col; j++)            if (g[i][j])                seq[n++] = (i-1) * col + j - 1;    if (seq[n-1] != col * row - 1)        seq[n++] = row * col - 1;    memset(pre,-1,sizeof(pre));    for (int i = 0; i < n; i++){        dp[i] = 1,num[i] = 1;        for (int j = 0; j < i; j++)            if ((seq[i] % col) >= seq[j] % col){                if (dp[i] < dp[j] + 1){                    dp[i] = dp[j] + 1;                    num[i] = num[j];                    pre[i] = j;                }                else if (dp[i] == dp[j] + 1)                    num[i] += num[j];            }    }    if (!g[row][col])        --dp[n-1];}void outpath(int u){    if (pre[u] != -1)        outpath(pre[u]);    if (u != n-1 || g[row][col])        printf(" %d",seq[u] + 1);}int main(){    int t = 0;    while (scanf("%d%d",&row,&col) != EOF){        if (col == -1 && row == -1)            break;        int x,y;        memset(g,false,sizeof(g));        while (scanf("%d%d",&x,&y) && x && y)            g[x][y] = true;        solve();        printf("CASE#%d: %d %d", ++t, dp[n-1], num[n-1]);        outpath(n-1);        printf("\n");    }    return 0;}