首页 新闻 搜索 专区 学院

一道网易的编程题

0
悬赏园豆:5 [已解决问题] 解决于 2018-04-01 12:10

一条长为n的路,需要用路灯点亮,其中"."表示需要点亮的位置,"X"表示无需点亮的位置,假设灯立在i处,则它可以点亮i-1,i,i+1三个位置,问至少需要多少灯才能点亮整条路。

luoyin500的主页 luoyin500 | 初学一级 | 园豆:89
提问于:2018-03-28 00:33
< >
分享
最佳答案
0

这道题目的正确解法是动态规划:

代码如下:

状态转移公式情况较多

提供一些测试数据

XXXX....X.
2

.......X.
3

.X.
1

...
1

...XXXXXXXXX...X.
3

..........
4


XXXXXXXXXX...XX.....X..XXXX...
5

#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>

using namespace std;
const int  INF=10000000;
char a[105];
//到i点至少点燃了x个灯,最后一个灯的位置为j的情况下,道路被点亮了
int dp[105][105];
int main()
{
    
    scanf("%s",a+1);
    int len = strlen(a+1);
    
    for(int i=0;i<=100;i++)
    {
        for(int j=0;j<=100;j++)
        {
            dp[i][j]=INF;
        }
    }
  
    dp[0][0]=0;
    for(int i=1;i<=len;i++)
    {
        
        for(int j=0;j<=i-1;j++)
        {
            if(dp[i-1][j]==INF) continue;
            if(a[i]=='X')
            {
                dp[i][j]=min(dp[i][j],dp[i-1][j]);
              
            }
            else if(a[i]=='.')
            {
                if(j==i-1&&j!=0)
                    dp[i][j]=min(dp[i][j],dp[i-1][j]);
                else
                    dp[i][i]=min(dp[i][i],dp[i-1][j]+1);
            }
            
          
        }
        for(int j=0;j<=i-2;j++)
        {
            if(dp[i-2][j]==INF) continue;
            if(a[i]=='X'&&a[i-1]=='X')
                dp[i][j] = min(dp[i][j],dp[i-2][j]);
            else
            {
                if(j==i-2&&j!=0)
                {
                    if(a[i]=='X')
                        dp[i][j] = min(dp[i][j],dp[i-2][j]);
                    else if(a[i]=='.')
                        dp[i][i] = min(dp[i][i],dp[i-2][j]+1);
                }
                else
                {
                    dp[i][i] = min(dp[i][i],dp[i-2][j]+1);
                    dp[i][i-1]=min(dp[i][i-1],dp[i-2][j]+1);
                }
                
            }
            
        }
        
        for(int j=0;j<=i-3;j++)
        {
            if(dp[i-3][j]==INF) continue;
            if(a[i]=='X'&&a[i-1]=='X'&&a[i-2]=='X')
                dp[i][j] = min(dp[i][j],dp[i-3][j]);
            
            else
            {
                if(j==i-3&&j!=0)
                {
                    if(a[i]=='X'&&a[i-1]=='X')
                        dp[i][j] = min(dp[i][j],dp[i-3][j]);
                    else
                    {
                        dp[i][i] = min(dp[i][i],dp[i-3][j]+1);
                        dp[i][i-1]=min(dp[i][i-1],dp[i-3][j]+1);
                    }
                }
                else
                {
                    if(a[i]=='X')
                        dp[i][i-2]=min(dp[i][i-2],dp[i-3][j]+1);
                    else if(a[i-2]=='X')
                        dp[i][i]=min(dp[i][i],dp[i-3][j]+1);
                    else
                        dp[i][i-1]=min(dp[i][i-1],dp[i-3][j]+1);
                }
            }
           
        }
        
        
    }
    for(int i=0;i<=len;i++)
    {
        if(dp[len][i]!=INF)
        {
            printf("%d\n",dp[len][i]);
            break;
        }
    }
    return 0;
}

 

收获园豆:5
Shendu.CC | 小虾三级 |园豆:1914 | 2018-03-28 12:37
其他回答(3)
0

在a长的路需要的灯数

count=a%2==0?a/2:(int)a/2+1;

统计需要点亮的位置的长度list(int) PointList

foreach var a in PointList

{

count+=a%2==0?a/2:(int)a/2+1;

}

 

 

猝不及防 | 园豆:2022 (老鸟四级) | 2018-03-28 08:46

@Shendu.cc: 哪错了呢

支持(0) 反对(0) 猝不及防 | 园豆:2022 (老鸟四级) | 2018-03-28 10:53
1
int solve(char s[], int n) {
    int ans = 0;
    for(int i = 0; i < n; i++) {
        if(s[i] == '.') {
            ans++;
            s[i] = 'X';
            if(i+1 < n&&s[i+1] == '.') s[i+1] = 'X';
            if(i+2 < n&&s[i+2] == '.') s[i+2] = 'X';
        }
    }    
    return ans;
}
我在地狱 | 园豆:202 (菜鸟二级) | 2018-03-28 10:10

@Shendu.cc:

代码已修改。

顺便,想知道这种数据是多少,1还是2?

.X.

支持(0) 反对(0) 我在地狱 | 园豆:202 (菜鸟二级) | 2018-03-28 12:26

@我在地狱: 1

支持(0) 反对(0) Shendu.CC | 园豆:1914 (小虾三级) | 2018-03-28 12:37

@Shendu.cc: 那我觉得我这么做应该没什么问题。你举的几个例子我跑出来都是对的。

支持(0) 反对(0) 我在地狱 | 园豆:202 (菜鸟二级) | 2018-03-28 12:39

@我在地狱: 嗯,这题目贪心解法是正解,而且代码量很少,用动态规划虽然可以解,但是反而麻烦了。

支持(0) 反对(0) Shendu.CC | 园豆:1914 (小虾三级) | 2018-03-28 12:45
0

0盏灯,都为x

番茄先生 | 园豆:901 (小虾三级) | 2018-03-28 10:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册