10599 - Robots(II)
【摘要】 题目链接~~>
做题感悟:这题度题意就读了很久,很经典,主要是想到怎样转化。
解题思路:
如果第 i 个垃圾标号小于第 j 个垃圾,且i 列坐标不大于 j 的列坐标那么就可以由 i 到 j 形成一条路(机器人只向下 ,向右走),这...
做题感悟:这题度题意就读了很久,很经典,主要是想到怎样转化。
解题思路:
如果第 i 个垃圾标号小于第 j 个垃圾,且i 列坐标不大于 j 的列坐标那么就可以由 i 到 j 形成一条路(机器人只向下 ,向右走),这样用dp 一边,跟求最长单调递增序列一样,同时记录到达每个点的方法数 ,还要注意如果在左下角没有垃圾要人为添加一个,到最后输出的时候不输出即可。
代码:
-
#include<iostream>
-
#include<fstream>
-
#include<iomanip>
-
#include<ctime>
-
#include<fstream>
-
#include<sstream>
-
#include<stack>
-
#include<cstring>
-
#include<map>
-
#include<vector>
-
#include<cstdio>
-
#include<algorithm>
-
#define INT long long int
-
using namespace std ;
-
const INT INF = 1000000000 ;
-
const INT MY = 59 ;
-
const INT MX = 10000 + 10 ;
-
INT n ,m ,num ,cse=1 ;
-
bool flag ;
-
INT g[MX] ,pre[MX] ,dp[MX] ,key[MX] ;
-
void input()
-
{
-
memset(dp ,0 ,sizeof(dp)) ;
-
memset(key ,0 ,sizeof(key)) ;
-
flag = false ;
-
INT x ,y ;
-
num = 0 ;
-
while(scanf("%lld%lld",&x ,&y) && x+y)
-
{
-
x-- ; y-- ;
-
g[++num] = x*m + y ;
-
}
-
sort(g+1 ,g+num+1) ;// 切记!给的不一定有序
-
if(num && g[num] != n*m-1)
-
{
-
flag = true ;
-
g[++num] = n*m-1 ;
-
}
-
for(INT i = 0 ;i <= num ;i++)
-
pre[i] = i ;
-
}
-
void DP()
-
{
-
for(INT i = 1 ;i <= num ;i++)
-
{
-
dp[i] = 1 ; key[i] = 1 ;
-
for(INT j = 1 ;j < i ;j++)
-
if(g[i]%m >= g[j]%m)
-
{
-
if(dp[i] < dp[j] + 1)
-
{
-
dp[i] = dp[j] + 1 ;
-
key[i] = key[j] ;
-
pre[i] = j ;
-
}
-
else if(dp[i] == dp[j] + 1)
-
{
-
key[i] +=key[j] ;
-
pre[i] = j ;
-
}
-
}
-
}
-
cout<<"CASE#"<<cse++<<": " ;
-
if(flag)
-
cout<<dp[num] - 1<<" "<<key[num] ;
-
else cout<<dp[num]<<" "<<key[num] ;
-
}
-
void output(INT num) // 递归输出
-
{
-
if(pre[num] != num)
-
{
-
output(pre[num]) ;
-
cout<<" "<<g[num]+1 ;
-
}
-
else
-
cout<<" "<<g[num]+1 ;
-
return ;
-
}
-
int main()
-
{
-
while(~scanf("%lld%lld",&n ,&m))
-
{
-
-
if(n == -1 && m == -1) break ;
-
input() ;
-
if(!num) //
-
{
-
cout<<"CASE#"<<cse++<<": " ;
-
cout<<"0 0"<<endl ;
-
continue ;
-
}
-
DP() ;
-
if(pre[num] != num)
-
output(pre[num]) ;
-
if(!flag) cout<<" "<<n*m ;
-
cout<<endl ;
-
}
-
return 0 ;
-
}
文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/nyist_zxp/article/details/38562447
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)