一条长为n的路,需要用路灯点亮,其中"."表示需要点亮的位置,"X"表示无需点亮的位置,假设灯立在i处,则它可以点亮i-1,i,i+1三个位置,问至少需要多少灯才能点亮整条路。
这道题目的正确解法是动态规划:
代码如下:
状态转移公式情况较多
提供一些测试数据
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; }
在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;
}
@Shendu.cc: 哪错了呢
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; }
@Shendu.cc:
代码已修改。
顺便,想知道这种数据是多少,1还是2?
.X.
@我在地狱: 1
@Shendu.cc: 那我觉得我这么做应该没什么问题。你举的几个例子我跑出来都是对的。
@我在地狱: 嗯,这题目贪心解法是正解,而且代码量很少,用动态规划虽然可以解,但是反而麻烦了。
0盏灯,都为x